Commit d9d7210c7dc2975f27e8d97e10f2ab3ff648d373
1 parent
e2b577e5
Fix PowerPC 32 emulation on 64 bits hosts:
we can use 64 bits registers but not pretend page is 1kB long As it seems most Linux programs assume page-size is 4kB, never allow 1kB pages for user-mode only emulation. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3182 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
20 additions
and
12 deletions
target-ppc/cpu.h
| @@ -23,19 +23,10 @@ | @@ -23,19 +23,10 @@ | ||
| 23 | #include "config.h" | 23 | #include "config.h" |
| 24 | #include <inttypes.h> | 24 | #include <inttypes.h> |
| 25 | 25 | ||
| 26 | -#if !defined(TARGET_PPCEMB) | ||
| 27 | -#if defined(TARGET_PPC64) || (HOST_LONG_BITS >= 64) | ||
| 28 | -/* When using 64 bits temporary registers, | ||
| 29 | - * we can use 64 bits GPR with no extra cost | ||
| 30 | - */ | ||
| 31 | -#define TARGET_PPCEMB | ||
| 32 | -#endif | ||
| 33 | -#endif | ||
| 34 | - | ||
| 35 | #if defined (TARGET_PPC64) | 26 | #if defined (TARGET_PPC64) |
| 36 | typedef uint64_t ppc_gpr_t; | 27 | typedef uint64_t ppc_gpr_t; |
| 37 | -#define TARGET_LONG_BITS 64 | ||
| 38 | #define TARGET_GPR_BITS 64 | 28 | #define TARGET_GPR_BITS 64 |
| 29 | +#define TARGET_LONG_BITS 64 | ||
| 39 | #define REGX "%016" PRIx64 | 30 | #define REGX "%016" PRIx64 |
| 40 | #define TARGET_PAGE_BITS 12 | 31 | #define TARGET_PAGE_BITS 12 |
| 41 | #elif defined(TARGET_PPCEMB) | 32 | #elif defined(TARGET_PPCEMB) |
| @@ -43,15 +34,32 @@ typedef uint64_t ppc_gpr_t; | @@ -43,15 +34,32 @@ typedef uint64_t ppc_gpr_t; | ||
| 43 | #define TARGET_PHYS_ADDR_BITS 64 | 34 | #define TARGET_PHYS_ADDR_BITS 64 |
| 44 | /* GPR are 64 bits: used by vector extension */ | 35 | /* GPR are 64 bits: used by vector extension */ |
| 45 | typedef uint64_t ppc_gpr_t; | 36 | typedef uint64_t ppc_gpr_t; |
| 46 | -#define TARGET_LONG_BITS 32 | ||
| 47 | #define TARGET_GPR_BITS 64 | 37 | #define TARGET_GPR_BITS 64 |
| 38 | +#define TARGET_LONG_BITS 32 | ||
| 48 | #define REGX "%016" PRIx64 | 39 | #define REGX "%016" PRIx64 |
| 40 | +#if defined(CONFIG_USER_ONLY) | ||
| 41 | +/* It looks like a lot of Linux programs assume page size | ||
| 42 | + * is 4kB long. This is evil, but we have to deal with it... | ||
| 43 | + */ | ||
| 44 | +#define TARGET_PAGE_BITS 12 | ||
| 45 | +#else | ||
| 49 | /* Pages can be 1 kB small */ | 46 | /* Pages can be 1 kB small */ |
| 50 | #define TARGET_PAGE_BITS 10 | 47 | #define TARGET_PAGE_BITS 10 |
| 48 | +#endif | ||
| 49 | +#else | ||
| 50 | +#if (HOST_LONG_BITS >= 64) | ||
| 51 | +/* When using 64 bits temporary registers, | ||
| 52 | + * we can use 64 bits GPR with no extra cost | ||
| 53 | + * It's even an optimization as it will prevent | ||
| 54 | + * the compiler to do unuseful masking in the micro-ops. | ||
| 55 | + */ | ||
| 56 | +typedef uint64_t ppc_gpr_t; | ||
| 57 | +#define TARGET_GPR_BITS 64 | ||
| 51 | #else | 58 | #else |
| 52 | typedef uint32_t ppc_gpr_t; | 59 | typedef uint32_t ppc_gpr_t; |
| 53 | -#define TARGET_LONG_BITS 32 | ||
| 54 | #define TARGET_GPR_BITS 32 | 60 | #define TARGET_GPR_BITS 32 |
| 61 | +#endif | ||
| 62 | +#define TARGET_LONG_BITS 32 | ||
| 55 | #define REGX "%08" PRIx32 | 63 | #define REGX "%08" PRIx32 |
| 56 | #define TARGET_PAGE_BITS 12 | 64 | #define TARGET_PAGE_BITS 12 |
| 57 | #endif | 65 | #endif |