Commit b29fe3ed48c72e6a30a29c7fbdf3b841c59551c5
1 parent
14f87098
Preliminary AIX support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5732 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
7 changed files
with
79 additions
and
4 deletions
Makefile.target
| @@ -763,10 +763,12 @@ endif | @@ -763,10 +763,12 @@ endif | ||
| 763 | ifndef CONFIG_DARWIN | 763 | ifndef CONFIG_DARWIN |
| 764 | ifndef CONFIG_WIN32 | 764 | ifndef CONFIG_WIN32 |
| 765 | ifndef CONFIG_SOLARIS | 765 | ifndef CONFIG_SOLARIS |
| 766 | +ifndef CONFIG_AIX | ||
| 766 | LIBS+=-lutil | 767 | LIBS+=-lutil |
| 767 | endif | 768 | endif |
| 768 | endif | 769 | endif |
| 769 | endif | 770 | endif |
| 771 | +endif | ||
| 770 | ifdef TARGET_GPROF | 772 | ifdef TARGET_GPROF |
| 771 | vl.o: CFLAGS+=-p | 773 | vl.o: CFLAGS+=-p |
| 772 | LDFLAGS+=-p | 774 | LDFLAGS+=-p |
configure
| @@ -32,7 +32,7 @@ ar="ar" | @@ -32,7 +32,7 @@ ar="ar" | ||
| 32 | make="make" | 32 | make="make" |
| 33 | install="install" | 33 | install="install" |
| 34 | strip="strip" | 34 | strip="strip" |
| 35 | -cpu=`uname -m` | 35 | +cpu=`test $(uname -s) = AIX && uname -p || uname -m` |
| 36 | target_list="" | 36 | target_list="" |
| 37 | case "$cpu" in | 37 | case "$cpu" in |
| 38 | i386|i486|i586|i686|i86pc|BePC) | 38 | i386|i486|i586|i686|i86pc|BePC) |
| @@ -68,7 +68,7 @@ case "$cpu" in | @@ -68,7 +68,7 @@ case "$cpu" in | ||
| 68 | mips64) | 68 | mips64) |
| 69 | cpu="mips64" | 69 | cpu="mips64" |
| 70 | ;; | 70 | ;; |
| 71 | - "Power Macintosh"|ppc|ppc64) | 71 | + "Power Macintosh"|ppc|ppc64|powerpc) |
| 72 | cpu="powerpc" | 72 | cpu="powerpc" |
| 73 | ;; | 73 | ;; |
| 74 | s390*) | 74 | s390*) |
| @@ -117,6 +117,7 @@ mixemu="no" | @@ -117,6 +117,7 @@ mixemu="no" | ||
| 117 | bluez="yes" | 117 | bluez="yes" |
| 118 | kvm="yes" | 118 | kvm="yes" |
| 119 | kerneldir="" | 119 | kerneldir="" |
| 120 | +aix="no" | ||
| 120 | 121 | ||
| 121 | # OS specific | 122 | # OS specific |
| 122 | targetos=`uname -s` | 123 | targetos=`uname -s` |
| @@ -206,6 +207,10 @@ SunOS) | @@ -206,6 +207,10 @@ SunOS) | ||
| 206 | fi | 207 | fi |
| 207 | audio_possible_drivers="oss sdl" | 208 | audio_possible_drivers="oss sdl" |
| 208 | ;; | 209 | ;; |
| 210 | +AIX) | ||
| 211 | +aix="yes" | ||
| 212 | +make="gmake" | ||
| 213 | +;; | ||
| 209 | *) | 214 | *) |
| 210 | audio_drv_list="oss" | 215 | audio_drv_list="oss" |
| 211 | audio_possible_drivers="oss alsa sdl esd pa" | 216 | audio_possible_drivers="oss alsa sdl esd pa" |
| @@ -1220,6 +1225,12 @@ if test "$darwin" = "yes" ; then | @@ -1220,6 +1225,12 @@ if test "$darwin" = "yes" ; then | ||
| 1220 | echo "CONFIG_DARWIN=yes" >> $config_mak | 1225 | echo "CONFIG_DARWIN=yes" >> $config_mak |
| 1221 | echo "#define CONFIG_DARWIN 1" >> $config_h | 1226 | echo "#define CONFIG_DARWIN 1" >> $config_h |
| 1222 | fi | 1227 | fi |
| 1228 | + | ||
| 1229 | +if test "$aix" = "yes" ; then | ||
| 1230 | + echo "CONFIG_AIX=yes" >> $config_mak | ||
| 1231 | + echo "#define CONFIG_AIX 1" >> $config_h | ||
| 1232 | +fi | ||
| 1233 | + | ||
| 1223 | if test "$solaris" = "yes" ; then | 1234 | if test "$solaris" = "yes" ; then |
| 1224 | echo "CONFIG_SOLARIS=yes" >> $config_mak | 1235 | echo "CONFIG_SOLARIS=yes" >> $config_mak |
| 1225 | echo "#define HOST_SOLARIS $solarisrev" >> $config_h | 1236 | echo "#define HOST_SOLARIS $solarisrev" >> $config_h |
fpu/softfloat.h
| @@ -50,8 +50,10 @@ these four paragraphs for those parts of this code that are retained. | @@ -50,8 +50,10 @@ these four paragraphs for those parts of this code that are retained. | ||
| 50 | typedef uint8_t flag; | 50 | typedef uint8_t flag; |
| 51 | typedef uint8_t uint8; | 51 | typedef uint8_t uint8; |
| 52 | typedef int8_t int8; | 52 | typedef int8_t int8; |
| 53 | +#ifndef _AIX | ||
| 53 | typedef int uint16; | 54 | typedef int uint16; |
| 54 | typedef int int16; | 55 | typedef int int16; |
| 56 | +#endif | ||
| 55 | typedef unsigned int uint32; | 57 | typedef unsigned int uint32; |
| 56 | typedef signed int int32; | 58 | typedef signed int int32; |
| 57 | typedef uint64_t uint64; | 59 | typedef uint64_t uint64; |
net.c
| @@ -780,6 +780,12 @@ static int tap_open(char *ifname, int ifname_size) | @@ -780,6 +780,12 @@ static int tap_open(char *ifname, int ifname_size) | ||
| 780 | fcntl(fd, F_SETFL, O_NONBLOCK); | 780 | fcntl(fd, F_SETFL, O_NONBLOCK); |
| 781 | return fd; | 781 | return fd; |
| 782 | } | 782 | } |
| 783 | +#elif defined (_AIX) | ||
| 784 | +static int tap_open(char *ifname, int ifname_size) | ||
| 785 | +{ | ||
| 786 | + fprintf (stderr, "no tap on AIX\n"); | ||
| 787 | + return -1; | ||
| 788 | +} | ||
| 783 | #else | 789 | #else |
| 784 | static int tap_open(char *ifname, int ifname_size) | 790 | static int tap_open(char *ifname, int ifname_size) |
| 785 | { | 791 | { |
| @@ -1441,6 +1447,7 @@ int net_client_init(const char *device, const char *p) | @@ -1441,6 +1447,7 @@ int net_client_init(const char *device, const char *p) | ||
| 1441 | vlan->nb_host_devs++; | 1447 | vlan->nb_host_devs++; |
| 1442 | ret = tap_win32_init(vlan, ifname); | 1448 | ret = tap_win32_init(vlan, ifname); |
| 1443 | } else | 1449 | } else |
| 1450 | +#elif defined (_AIX) | ||
| 1444 | #else | 1451 | #else |
| 1445 | if (!strcmp(device, "tap")) { | 1452 | if (!strcmp(device, "tap")) { |
| 1446 | char ifname[64]; | 1453 | char ifname[64]; |
tcg/ppc/tcg-target.c
| @@ -27,6 +27,9 @@ static uint8_t *tb_ret_addr; | @@ -27,6 +27,9 @@ static uint8_t *tb_ret_addr; | ||
| 27 | #ifdef __APPLE__ | 27 | #ifdef __APPLE__ |
| 28 | #define LINKAGE_AREA_SIZE 24 | 28 | #define LINKAGE_AREA_SIZE 24 |
| 29 | #define LR_OFFSET 8 | 29 | #define LR_OFFSET 8 |
| 30 | +#elif defined _AIX | ||
| 31 | +#define LINKAGE_AREA_SIZE 52 | ||
| 32 | +#define LR_OFFSET 8 | ||
| 30 | #else | 33 | #else |
| 31 | #define LINKAGE_AREA_SIZE 8 | 34 | #define LINKAGE_AREA_SIZE 8 |
| 32 | #define LR_OFFSET 4 | 35 | #define LR_OFFSET 4 |
| @@ -137,6 +140,9 @@ static const int tcg_target_callee_save_regs[] = { | @@ -137,6 +140,9 @@ static const int tcg_target_callee_save_regs[] = { | ||
| 137 | TCG_REG_R11, | 140 | TCG_REG_R11, |
| 138 | TCG_REG_R13, | 141 | TCG_REG_R13, |
| 139 | #endif | 142 | #endif |
| 143 | +#ifdef _AIX | ||
| 144 | + TCG_REG_R13, | ||
| 145 | +#endif | ||
| 140 | TCG_REG_R14, | 146 | TCG_REG_R14, |
| 141 | TCG_REG_R15, | 147 | TCG_REG_R15, |
| 142 | TCG_REG_R16, | 148 | TCG_REG_R16, |
| @@ -455,6 +461,24 @@ static void tcg_out_b (TCGContext *s, int mask, tcg_target_long target) | @@ -455,6 +461,24 @@ static void tcg_out_b (TCGContext *s, int mask, tcg_target_long target) | ||
| 455 | } | 461 | } |
| 456 | } | 462 | } |
| 457 | 463 | ||
| 464 | +#ifdef _AIX | ||
| 465 | +static void tcg_out_call (TCGContext *s, tcg_target_long arg, int const_arg) | ||
| 466 | +{ | ||
| 467 | + int reg; | ||
| 468 | + | ||
| 469 | + if (const_arg) { | ||
| 470 | + reg = 2; | ||
| 471 | + tcg_out_movi (s, TCG_TYPE_I32, reg, arg); | ||
| 472 | + } | ||
| 473 | + else reg = arg; | ||
| 474 | + | ||
| 475 | + tcg_out32 (s, LWZ | RT (0) | RA (reg)); | ||
| 476 | + tcg_out32 (s, MTSPR | RA (0) | CTR); | ||
| 477 | + tcg_out32 (s, LWZ | RT (2) | RA (reg) | 4); | ||
| 478 | + tcg_out32 (s, BCCTR | BO_ALWAYS | LK); | ||
| 479 | +} | ||
| 480 | +#endif | ||
| 481 | + | ||
| 458 | #if defined(CONFIG_SOFTMMU) | 482 | #if defined(CONFIG_SOFTMMU) |
| 459 | 483 | ||
| 460 | #include "../../softmmu_defs.h" | 484 | #include "../../softmmu_defs.h" |
| @@ -548,7 +572,11 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) | @@ -548,7 +572,11 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) | ||
| 548 | tcg_out_movi (s, TCG_TYPE_I32, 5, mem_index); | 572 | tcg_out_movi (s, TCG_TYPE_I32, 5, mem_index); |
| 549 | #endif | 573 | #endif |
| 550 | 574 | ||
| 575 | +#ifdef _AIX | ||
| 576 | + tcg_out_call (s, (tcg_target_long) qemu_ld_helpers[s_bits], 1); | ||
| 577 | +#else | ||
| 551 | tcg_out_b (s, LK, (tcg_target_long) qemu_ld_helpers[s_bits]); | 578 | tcg_out_b (s, LK, (tcg_target_long) qemu_ld_helpers[s_bits]); |
| 579 | +#endif | ||
| 552 | switch (opc) { | 580 | switch (opc) { |
| 553 | case 0|4: | 581 | case 0|4: |
| 554 | tcg_out32 (s, EXTSB | RA (data_reg) | RS (3)); | 582 | tcg_out32 (s, EXTSB | RA (data_reg) | RS (3)); |
| @@ -766,7 +794,11 @@ static void tcg_out_qemu_st (TCGContext *s, const TCGArg *args, int opc) | @@ -766,7 +794,11 @@ static void tcg_out_qemu_st (TCGContext *s, const TCGArg *args, int opc) | ||
| 766 | ir++; | 794 | ir++; |
| 767 | 795 | ||
| 768 | tcg_out_movi (s, TCG_TYPE_I32, ir, mem_index); | 796 | tcg_out_movi (s, TCG_TYPE_I32, ir, mem_index); |
| 797 | +#ifdef _AIX | ||
| 798 | + tcg_out_call (s, (tcg_target_long) qemu_st_helpers[opc], 1); | ||
| 799 | +#else | ||
| 769 | tcg_out_b (s, LK, (tcg_target_long) qemu_st_helpers[opc]); | 800 | tcg_out_b (s, LK, (tcg_target_long) qemu_st_helpers[opc]); |
| 801 | +#endif | ||
| 770 | label2_ptr = s->code_ptr; | 802 | label2_ptr = s->code_ptr; |
| 771 | tcg_out32 (s, B); | 803 | tcg_out32 (s, B); |
| 772 | 804 | ||
| @@ -836,6 +868,16 @@ void tcg_target_qemu_prologue (TCGContext *s) | @@ -836,6 +868,16 @@ void tcg_target_qemu_prologue (TCGContext *s) | ||
| 836 | ; | 868 | ; |
| 837 | frame_size = (frame_size + 15) & ~15; | 869 | frame_size = (frame_size + 15) & ~15; |
| 838 | 870 | ||
| 871 | +#ifdef _AIX | ||
| 872 | + { | ||
| 873 | + uint32_t addr; | ||
| 874 | + | ||
| 875 | + /* First emit adhoc function descriptor */ | ||
| 876 | + addr = (uint32_t) s->code_ptr + 12; | ||
| 877 | + tcg_out32 (s, addr); /* entry point */ | ||
| 878 | + s->code_ptr += 8; /* skip TOC and environment pointer */ | ||
| 879 | + } | ||
| 880 | +#endif | ||
| 839 | tcg_out32 (s, MFSPR | RT (0) | LR); | 881 | tcg_out32 (s, MFSPR | RT (0) | LR); |
| 840 | tcg_out32 (s, STWU | RS (1) | RA (1) | (-frame_size & 0xffff)); | 882 | tcg_out32 (s, STWU | RS (1) | RA (1) | (-frame_size & 0xffff)); |
| 841 | for (i = 0; i < ARRAY_SIZE (tcg_target_callee_save_regs); ++i) | 883 | for (i = 0; i < ARRAY_SIZE (tcg_target_callee_save_regs); ++i) |
| @@ -1106,6 +1148,9 @@ static void tcg_out_op(TCGContext *s, int opc, const TCGArg *args, | @@ -1106,6 +1148,9 @@ static void tcg_out_op(TCGContext *s, int opc, const TCGArg *args, | ||
| 1106 | } | 1148 | } |
| 1107 | break; | 1149 | break; |
| 1108 | case INDEX_op_call: | 1150 | case INDEX_op_call: |
| 1151 | +#ifdef _AIX | ||
| 1152 | + tcg_out_call (s, args[0], const_args[0]); | ||
| 1153 | +#else | ||
| 1109 | if (const_args[0]) { | 1154 | if (const_args[0]) { |
| 1110 | tcg_out_b (s, LK, args[0]); | 1155 | tcg_out_b (s, LK, args[0]); |
| 1111 | } | 1156 | } |
| @@ -1113,6 +1158,7 @@ static void tcg_out_op(TCGContext *s, int opc, const TCGArg *args, | @@ -1113,6 +1158,7 @@ static void tcg_out_op(TCGContext *s, int opc, const TCGArg *args, | ||
| 1113 | tcg_out32 (s, MTSPR | RS (args[0]) | LR); | 1158 | tcg_out32 (s, MTSPR | RS (args[0]) | LR); |
| 1114 | tcg_out32 (s, BCLR | BO_ALWAYS | LK); | 1159 | tcg_out32 (s, BCLR | BO_ALWAYS | LK); |
| 1115 | } | 1160 | } |
| 1161 | +#endif | ||
| 1116 | break; | 1162 | break; |
| 1117 | case INDEX_op_jmp: | 1163 | case INDEX_op_jmp: |
| 1118 | if (const_args[0]) { | 1164 | if (const_args[0]) { |
tcg/ppc/tcg-target.h
| @@ -65,11 +65,15 @@ enum { | @@ -65,11 +65,15 @@ enum { | ||
| 65 | /* used for function call generation */ | 65 | /* used for function call generation */ |
| 66 | #define TCG_REG_CALL_STACK TCG_REG_R1 | 66 | #define TCG_REG_CALL_STACK TCG_REG_R1 |
| 67 | #define TCG_TARGET_STACK_ALIGN 16 | 67 | #define TCG_TARGET_STACK_ALIGN 16 |
| 68 | -#ifdef __APPLE__ | 68 | +#if defined __APPLE__ |
| 69 | #define TCG_TARGET_CALL_STACK_OFFSET 24 | 69 | #define TCG_TARGET_CALL_STACK_OFFSET 24 |
| 70 | -#else | 70 | +#elif defined _AIX |
| 71 | +#define TCG_TARGET_CALL_STACK_OFFSET 52 | ||
| 72 | +#elif defined __linux__ | ||
| 71 | #define TCG_TARGET_CALL_ALIGN_ARGS 1 | 73 | #define TCG_TARGET_CALL_ALIGN_ARGS 1 |
| 72 | #define TCG_TARGET_CALL_STACK_OFFSET 8 | 74 | #define TCG_TARGET_CALL_STACK_OFFSET 8 |
| 75 | +#else | ||
| 76 | +#error Unsupported system | ||
| 73 | #endif | 77 | #endif |
| 74 | 78 | ||
| 75 | /* optional instructions */ | 79 | /* optional instructions */ |
tcg/tcg.c