Commit e85e7c6ea411c42e24e6e7b8ff5cdd99faae317a
1 parent
b5334159
Use the new TARGET_ABI32 feature to implement a ppc64abi32-linux-user target
(PowerPC 64 running in 32 bits mode). Use the new TARGET_ABI_DIR feature to implement a ppcemb-linux-user target (PowerPC 32 with 64 bits GPRs and vector extensions). git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3409 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
24 additions
and
11 deletions
configure
| @@ -504,7 +504,7 @@ if test -z "$target_list" ; then | @@ -504,7 +504,7 @@ if test -z "$target_list" ; then | ||
| 504 | fi | 504 | fi |
| 505 | # the following are Linux specific | 505 | # the following are Linux specific |
| 506 | if [ "$linux_user" = "yes" ] ; then | 506 | if [ "$linux_user" = "yes" ] ; then |
| 507 | - target_list="i386-linux-user arm-linux-user armeb-linux-user sparc-linux-user sparc64-linux-user sparc32plus-linux-user mips-linux-user mipsel-linux-user m68k-linux-user alpha-linux-user sh4-linux-user ppc-linux-user ppc64-linux-user x86_64-linux-user cris-linux-user $target_list" | 507 | + target_list="i386-linux-user arm-linux-user armeb-linux-user sparc-linux-user sparc64-linux-user sparc32plus-linux-user mips-linux-user mipsel-linux-user m68k-linux-user alpha-linux-user sh4-linux-user ppc-linux-user ppcemb-linux-user ppc64-linux-user ppc64abi32-linux-user x86_64-linux-user cris-linux-user $target_list" |
| 508 | fi | 508 | fi |
| 509 | # the following are Darwin specific | 509 | # the following are Darwin specific |
| 510 | if [ "$darwin_user" = "yes" ] ; then | 510 | if [ "$darwin_user" = "yes" ] ; then |
| @@ -937,6 +937,7 @@ target_bigendian="no" | @@ -937,6 +937,7 @@ target_bigendian="no" | ||
| 937 | [ "$target_cpu" = "ppc" ] && target_bigendian=yes | 937 | [ "$target_cpu" = "ppc" ] && target_bigendian=yes |
| 938 | [ "$target_cpu" = "ppcemb" ] && target_bigendian=yes | 938 | [ "$target_cpu" = "ppcemb" ] && target_bigendian=yes |
| 939 | [ "$target_cpu" = "ppc64" ] && target_bigendian=yes | 939 | [ "$target_cpu" = "ppc64" ] && target_bigendian=yes |
| 940 | +[ "$target_cpu" = "ppc64abi32" ] && target_bigendian=yes | ||
| 940 | [ "$target_cpu" = "ppc64h" ] && target_bigendian=yes | 941 | [ "$target_cpu" = "ppc64h" ] && target_bigendian=yes |
| 941 | [ "$target_cpu" = "mips" ] && target_bigendian=yes | 942 | [ "$target_cpu" = "mips" ] && target_bigendian=yes |
| 942 | [ "$target_cpu" = "mipsn32" ] && target_bigendian=yes | 943 | [ "$target_cpu" = "mipsn32" ] && target_bigendian=yes |
| @@ -1040,6 +1041,7 @@ elif test "$target_cpu" = "ppc" ; then | @@ -1040,6 +1041,7 @@ elif test "$target_cpu" = "ppc" ; then | ||
| 1040 | echo "#define TARGET_PPC 1" >> $config_h | 1041 | echo "#define TARGET_PPC 1" >> $config_h |
| 1041 | elif test "$target_cpu" = "ppcemb" ; then | 1042 | elif test "$target_cpu" = "ppcemb" ; then |
| 1042 | echo "TARGET_ARCH=ppcemb" >> $config_mak | 1043 | echo "TARGET_ARCH=ppcemb" >> $config_mak |
| 1044 | + echo "TARGET_ABI_DIR=ppc" >> $config_mak | ||
| 1043 | echo "#define TARGET_ARCH \"ppcemb\"" >> $config_h | 1045 | echo "#define TARGET_ARCH \"ppcemb\"" >> $config_h |
| 1044 | echo "#define TARGET_PPC 1" >> $config_h | 1046 | echo "#define TARGET_PPC 1" >> $config_h |
| 1045 | echo "#define TARGET_PPCEMB 1" >> $config_h | 1047 | echo "#define TARGET_PPCEMB 1" >> $config_h |
| @@ -1048,6 +1050,13 @@ elif test "$target_cpu" = "ppc64" ; then | @@ -1048,6 +1050,13 @@ elif test "$target_cpu" = "ppc64" ; then | ||
| 1048 | echo "#define TARGET_ARCH \"ppc64\"" >> $config_h | 1050 | echo "#define TARGET_ARCH \"ppc64\"" >> $config_h |
| 1049 | echo "#define TARGET_PPC 1" >> $config_h | 1051 | echo "#define TARGET_PPC 1" >> $config_h |
| 1050 | echo "#define TARGET_PPC64 1" >> $config_h | 1052 | echo "#define TARGET_PPC64 1" >> $config_h |
| 1053 | +elif test "$target_cpu" = "ppc64abi32" ; then | ||
| 1054 | + echo "TARGET_ARCH=ppc64" >> $config_mak | ||
| 1055 | + echo "#define TARGET_ARCH \"ppc64\"" >> $config_h | ||
| 1056 | + echo "TARGET_ABI_DIR=ppc" >> $config_mak | ||
| 1057 | + echo "#define TARGET_PPC 1" >> $config_h | ||
| 1058 | + echo "#define TARGET_PPC64 1" >> $config_h | ||
| 1059 | + echo "#define TARGET_ABI32 1" >> $config_h | ||
| 1051 | elif test "$target_cpu" = "ppc64h" ; then | 1060 | elif test "$target_cpu" = "ppc64h" ; then |
| 1052 | echo "TARGET_ARCH=ppc64h" >> $config_mak | 1061 | echo "TARGET_ARCH=ppc64h" >> $config_mak |
| 1053 | echo "#define TARGET_ARCH \"ppc64h\"" >> $config_h | 1062 | echo "#define TARGET_ARCH \"ppc64h\"" >> $config_h |
linux-user/elfload.c
| @@ -269,7 +269,7 @@ static inline void init_thread(struct target_pt_regs *regs, struct image_info *i | @@ -269,7 +269,7 @@ static inline void init_thread(struct target_pt_regs *regs, struct image_info *i | ||
| 269 | 269 | ||
| 270 | #define ELF_START_MMAP 0x80000000 | 270 | #define ELF_START_MMAP 0x80000000 |
| 271 | 271 | ||
| 272 | -#ifdef TARGET_PPC64 | 272 | +#if defined(TARGET_PPC64) && !defined(TARGET_ABI32) |
| 273 | 273 | ||
| 274 | #define elf_check_arch(x) ( (x) == EM_PPC64 ) | 274 | #define elf_check_arch(x) ( (x) == EM_PPC64 ) |
| 275 | 275 | ||
| @@ -325,13 +325,13 @@ static inline void init_thread(struct target_pt_regs *_regs, struct image_info * | @@ -325,13 +325,13 @@ static inline void init_thread(struct target_pt_regs *_regs, struct image_info * | ||
| 325 | { | 325 | { |
| 326 | abi_ulong pos = infop->start_stack; | 326 | abi_ulong pos = infop->start_stack; |
| 327 | abi_ulong tmp; | 327 | abi_ulong tmp; |
| 328 | -#ifdef TARGET_PPC64 | 328 | +#if defined(TARGET_PPC64) && !defined(TARGET_ABI32) |
| 329 | abi_ulong entry, toc; | 329 | abi_ulong entry, toc; |
| 330 | #endif | 330 | #endif |
| 331 | 331 | ||
| 332 | _regs->msr = 1 << MSR_PR; /* Set user mode */ | 332 | _regs->msr = 1 << MSR_PR; /* Set user mode */ |
| 333 | _regs->gpr[1] = infop->start_stack; | 333 | _regs->gpr[1] = infop->start_stack; |
| 334 | -#ifdef TARGET_PPC64 | 334 | +#if defined(TARGET_PPC64) && !defined(TARGET_ABI32) |
| 335 | entry = ldq_raw(infop->entry) + infop->load_addr; | 335 | entry = ldq_raw(infop->entry) + infop->load_addr; |
| 336 | toc = ldq_raw(infop->entry + 8) + infop->load_addr; | 336 | toc = ldq_raw(infop->entry + 8) + infop->load_addr; |
| 337 | _regs->gpr[2] = toc; | 337 | _regs->gpr[2] = toc; |
linux-user/main.c
| @@ -1008,7 +1008,7 @@ void cpu_loop(CPUPPCState *env) | @@ -1008,7 +1008,7 @@ void cpu_loop(CPUPPCState *env) | ||
| 1008 | "Aborting\n"); | 1008 | "Aborting\n"); |
| 1009 | break; | 1009 | break; |
| 1010 | #endif /* defined(TARGET_PPCEMB) */ | 1010 | #endif /* defined(TARGET_PPCEMB) */ |
| 1011 | -#if defined(TARGET_PPC64) /* PowerPC 64 */ | 1011 | +#if defined(TARGET_PPC64) && !defined(TARGET_ABI32) /* PowerPC 64 */ |
| 1012 | case POWERPC_EXCP_DSEG: /* Data segment exception */ | 1012 | case POWERPC_EXCP_DSEG: /* Data segment exception */ |
| 1013 | cpu_abort(env, "Data segment exception while in user mode. " | 1013 | cpu_abort(env, "Data segment exception while in user mode. " |
| 1014 | "Aborting\n"); | 1014 | "Aborting\n"); |
| @@ -1017,19 +1017,21 @@ void cpu_loop(CPUPPCState *env) | @@ -1017,19 +1017,21 @@ void cpu_loop(CPUPPCState *env) | ||
| 1017 | cpu_abort(env, "Instruction segment exception " | 1017 | cpu_abort(env, "Instruction segment exception " |
| 1018 | "while in user mode. Aborting\n"); | 1018 | "while in user mode. Aborting\n"); |
| 1019 | break; | 1019 | break; |
| 1020 | -#endif /* defined(TARGET_PPC64) */ | ||
| 1021 | -#if defined(TARGET_PPC64H) /* PowerPC 64 with hypervisor mode support */ | 1020 | +#endif /* defined(TARGET_PPC64) && !defined(TARGET_ABI32) */ |
| 1021 | +#if defined(TARGET_PPC64H) && !defined(TARGET_ABI32) | ||
| 1022 | + /* PowerPC 64 with hypervisor mode support */ | ||
| 1022 | case POWERPC_EXCP_HDECR: /* Hypervisor decrementer exception */ | 1023 | case POWERPC_EXCP_HDECR: /* Hypervisor decrementer exception */ |
| 1023 | cpu_abort(env, "Hypervisor decrementer interrupt " | 1024 | cpu_abort(env, "Hypervisor decrementer interrupt " |
| 1024 | "while in user mode. Aborting\n"); | 1025 | "while in user mode. Aborting\n"); |
| 1025 | break; | 1026 | break; |
| 1026 | -#endif /* defined(TARGET_PPC64H) */ | 1027 | +#endif /* defined(TARGET_PPC64H) && !defined(TARGET_ABI32) */ |
| 1027 | case POWERPC_EXCP_TRACE: /* Trace exception */ | 1028 | case POWERPC_EXCP_TRACE: /* Trace exception */ |
| 1028 | /* Nothing to do: | 1029 | /* Nothing to do: |
| 1029 | * we use this exception to emulate step-by-step execution mode. | 1030 | * we use this exception to emulate step-by-step execution mode. |
| 1030 | */ | 1031 | */ |
| 1031 | break; | 1032 | break; |
| 1032 | -#if defined(TARGET_PPC64H) /* PowerPC 64 with hypervisor mode support */ | 1033 | +#if defined(TARGET_PPC64H) && !defined(TARGET_ABI32) |
| 1034 | + /* PowerPC 64 with hypervisor mode support */ | ||
| 1033 | case POWERPC_EXCP_HDSI: /* Hypervisor data storage exception */ | 1035 | case POWERPC_EXCP_HDSI: /* Hypervisor data storage exception */ |
| 1034 | cpu_abort(env, "Hypervisor data storage exception " | 1036 | cpu_abort(env, "Hypervisor data storage exception " |
| 1035 | "while in user mode. Aborting\n"); | 1037 | "while in user mode. Aborting\n"); |
| @@ -1046,7 +1048,7 @@ void cpu_loop(CPUPPCState *env) | @@ -1046,7 +1048,7 @@ void cpu_loop(CPUPPCState *env) | ||
| 1046 | cpu_abort(env, "Hypervisor instruction segment exception " | 1048 | cpu_abort(env, "Hypervisor instruction segment exception " |
| 1047 | "while in user mode. Aborting\n"); | 1049 | "while in user mode. Aborting\n"); |
| 1048 | break; | 1050 | break; |
| 1049 | -#endif /* defined(TARGET_PPC64H) */ | 1051 | +#endif /* defined(TARGET_PPC64H) && !defined(TARGET_ABI32) */ |
| 1050 | case POWERPC_EXCP_VPU: /* Vector unavailable exception */ | 1052 | case POWERPC_EXCP_VPU: /* Vector unavailable exception */ |
| 1051 | EXCP_DUMP(env, "No Altivec instructions allowed\n"); | 1053 | EXCP_DUMP(env, "No Altivec instructions allowed\n"); |
| 1052 | info.si_signo = TARGET_SIGILL; | 1054 | info.si_signo = TARGET_SIGILL; |
| @@ -2170,8 +2172,10 @@ int main(int argc, char **argv) | @@ -2170,8 +2172,10 @@ int main(int argc, char **argv) | ||
| 2170 | if (i != 12 && i != 6 && i != 13) | 2172 | if (i != 12 && i != 6 && i != 13) |
| 2171 | env->msr[i] = (regs->msr >> i) & 1; | 2173 | env->msr[i] = (regs->msr >> i) & 1; |
| 2172 | } | 2174 | } |
| 2173 | -#if defined(TARGET_PPC64) | 2175 | +#if defined(TARGET_PPC64) && !defined(TARGET_ABI32) |
| 2174 | msr_sf = 1; | 2176 | msr_sf = 1; |
| 2177 | +#else | ||
| 2178 | + msr_sf = 0; | ||
| 2175 | #endif | 2179 | #endif |
| 2176 | env->nip = regs->nip; | 2180 | env->nip = regs->nip; |
| 2177 | for(i = 0; i < 32; i++) { | 2181 | for(i = 0; i < 32; i++) { |