tile: improve big-endian support
First, fix a bug in asm/unaligned.h; we need to just use the asm-generic unaligned.h so we properly choose endian-correct flavors. Second, keep the hv/hypervisor.h ABI fully "native" in the sense that we don't have __BIG_ENDIAN__ ifdefs there. Instead, we use macros in the head_NN.S assembly code to properly extract two 32-bit structure members from a 64-bit register holding the structure. Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
Tento commit je obsažen v:
@@ -15,11 +15,15 @@
|
||||
#ifndef _ASM_TILE_UNALIGNED_H
|
||||
#define _ASM_TILE_UNALIGNED_H
|
||||
|
||||
#include <linux/unaligned/le_struct.h>
|
||||
#include <linux/unaligned/be_byteshift.h>
|
||||
#include <linux/unaligned/generic.h>
|
||||
#define get_unaligned __get_unaligned_le
|
||||
#define put_unaligned __put_unaligned_le
|
||||
/*
|
||||
* We could implement faster get_unaligned_[be/le]64 using the ldna
|
||||
* instruction on tilegx; however, we need to either copy all of the
|
||||
* other generic functions to here (which is pretty ugly) or else
|
||||
* modify both the generic code and other arch code to allow arch
|
||||
* specific unaligned data access functions. Given these functions
|
||||
* are not often called, we'll stick with the generic version.
|
||||
*/
|
||||
#include <asm-generic/unaligned.h>
|
||||
|
||||
/*
|
||||
* Is the kernel doing fixups of unaligned accesses? If <0, no kernel
|
||||
|
@@ -564,16 +564,11 @@ int hv_confstr(HV_ConfstrQuery query, HV_VirtAddr buf, int len);
|
||||
/** Tile coordinate */
|
||||
typedef struct
|
||||
{
|
||||
#ifndef __BIG_ENDIAN__
|
||||
/** X coordinate, relative to supervisor's top-left coordinate */
|
||||
int x;
|
||||
|
||||
/** Y coordinate, relative to supervisor's top-left coordinate */
|
||||
int y;
|
||||
#else
|
||||
int y;
|
||||
int x;
|
||||
#endif
|
||||
} HV_Coord;
|
||||
|
||||
|
||||
@@ -1119,13 +1114,8 @@ HV_VirtAddrRange hv_inquire_virtual(int idx);
|
||||
/** A range of ASID values. */
|
||||
typedef struct
|
||||
{
|
||||
#ifndef __BIG_ENDIAN__
|
||||
HV_ASID start; /**< First ASID in the range. */
|
||||
unsigned int size; /**< Number of ASIDs. Zero for an invalid range. */
|
||||
#else
|
||||
unsigned int size; /**< Number of ASIDs. Zero for an invalid range. */
|
||||
HV_ASID start; /**< First ASID in the range. */
|
||||
#endif
|
||||
} HV_ASIDRange;
|
||||
|
||||
/** Returns information about a range of ASIDs.
|
||||
@@ -1449,7 +1439,6 @@ typedef enum
|
||||
/** Message recipient. */
|
||||
typedef struct
|
||||
{
|
||||
#ifndef __BIG_ENDIAN__
|
||||
/** X coordinate, relative to supervisor's top-left coordinate */
|
||||
unsigned int x:11;
|
||||
|
||||
@@ -1458,11 +1447,6 @@ typedef struct
|
||||
|
||||
/** Status of this recipient */
|
||||
HV_Recip_State state:10;
|
||||
#else //__BIG_ENDIAN__
|
||||
HV_Recip_State state:10;
|
||||
unsigned int y:11;
|
||||
unsigned int x:11;
|
||||
#endif
|
||||
} HV_Recipient;
|
||||
|
||||
/** Send a message to a set of recipients.
|
||||
|
Odkázat v novém úkolu
Zablokovat Uživatele