Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tcg: TCGMemOp is now accelerator independent MemOp
Preparation for collapsing the two byte swaps, adjust_endianness and handle_bswap, along the I/O path. Target dependant attributes are conditionalized upon NEED_CPU_H. Signed-off-by: Tony Nguyen <tony.nguyen@bt.com> Acked-by: David Gibson <david@gibson.dropbear.id.au> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Acked-by: Cornelia Huck <cohuck@redhat.com> Message-Id: <81d9cd7d7f5aaadfa772d6c48ecee834e9cf7882.1566466906.git.tony.nguyen@bt.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
- Loading branch information
1 parent
fec105c
commit 14776ab
Showing
39 changed files
with
421 additions
and
399 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
/* | ||
* Constants for memory operations | ||
* | ||
* Authors: | ||
* Richard Henderson <rth@twiddle.net> | ||
* | ||
* This work is licensed under the terms of the GNU GPL, version 2 or later. | ||
* See the COPYING file in the top-level directory. | ||
* | ||
*/ | ||
|
||
#ifndef MEMOP_H | ||
#define MEMOP_H | ||
|
||
typedef enum MemOp { | ||
MO_8 = 0, | ||
MO_16 = 1, | ||
MO_32 = 2, | ||
MO_64 = 3, | ||
MO_SIZE = 3, /* Mask for the above. */ | ||
|
||
MO_SIGN = 4, /* Sign-extended, otherwise zero-extended. */ | ||
|
||
MO_BSWAP = 8, /* Host reverse endian. */ | ||
#ifdef HOST_WORDS_BIGENDIAN | ||
MO_LE = MO_BSWAP, | ||
MO_BE = 0, | ||
#else | ||
MO_LE = 0, | ||
MO_BE = MO_BSWAP, | ||
#endif | ||
#ifdef NEED_CPU_H | ||
#ifdef TARGET_WORDS_BIGENDIAN | ||
MO_TE = MO_BE, | ||
#else | ||
MO_TE = MO_LE, | ||
#endif | ||
#endif | ||
/* | ||
* MO_UNALN accesses are never checked for alignment. | ||
* MO_ALIGN accesses will result in a call to the CPU's | ||
* do_unaligned_access hook if the guest address is not aligned. | ||
* The default depends on whether the target CPU defines | ||
* TARGET_ALIGNED_ONLY. | ||
* | ||
* Some architectures (e.g. ARMv8) need the address which is aligned | ||
* to a size more than the size of the memory access. | ||
* Some architectures (e.g. SPARCv9) need an address which is aligned, | ||
* but less strictly than the natural alignment. | ||
* | ||
* MO_ALIGN supposes the alignment size is the size of a memory access. | ||
* | ||
* There are three options: | ||
* - unaligned access permitted (MO_UNALN). | ||
* - an alignment to the size of an access (MO_ALIGN); | ||
* - an alignment to a specified size, which may be more or less than | ||
* the access size (MO_ALIGN_x where 'x' is a size in bytes); | ||
*/ | ||
MO_ASHIFT = 4, | ||
MO_AMASK = 7 << MO_ASHIFT, | ||
#ifdef NEED_CPU_H | ||
#ifdef TARGET_ALIGNED_ONLY | ||
MO_ALIGN = 0, | ||
MO_UNALN = MO_AMASK, | ||
#else | ||
MO_ALIGN = MO_AMASK, | ||
MO_UNALN = 0, | ||
#endif | ||
#endif | ||
MO_ALIGN_2 = 1 << MO_ASHIFT, | ||
MO_ALIGN_4 = 2 << MO_ASHIFT, | ||
MO_ALIGN_8 = 3 << MO_ASHIFT, | ||
MO_ALIGN_16 = 4 << MO_ASHIFT, | ||
MO_ALIGN_32 = 5 << MO_ASHIFT, | ||
MO_ALIGN_64 = 6 << MO_ASHIFT, | ||
|
||
/* Combinations of the above, for ease of use. */ | ||
MO_UB = MO_8, | ||
MO_UW = MO_16, | ||
MO_UL = MO_32, | ||
MO_SB = MO_SIGN | MO_8, | ||
MO_SW = MO_SIGN | MO_16, | ||
MO_SL = MO_SIGN | MO_32, | ||
MO_Q = MO_64, | ||
|
||
MO_LEUW = MO_LE | MO_UW, | ||
MO_LEUL = MO_LE | MO_UL, | ||
MO_LESW = MO_LE | MO_SW, | ||
MO_LESL = MO_LE | MO_SL, | ||
MO_LEQ = MO_LE | MO_Q, | ||
|
||
MO_BEUW = MO_BE | MO_UW, | ||
MO_BEUL = MO_BE | MO_UL, | ||
MO_BESW = MO_BE | MO_SW, | ||
MO_BESL = MO_BE | MO_SL, | ||
MO_BEQ = MO_BE | MO_Q, | ||
|
||
#ifdef NEED_CPU_H | ||
MO_TEUW = MO_TE | MO_UW, | ||
MO_TEUL = MO_TE | MO_UL, | ||
MO_TESW = MO_TE | MO_SW, | ||
MO_TESL = MO_TE | MO_SL, | ||
MO_TEQ = MO_TE | MO_Q, | ||
#endif | ||
|
||
MO_SSIZE = MO_SIZE | MO_SIGN, | ||
} MemOp; | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.