Commit b29fe3ed48c72e6a30a29c7fbdf3b841c59551c5

Authored by malc
1 parent 14f87098

Preliminary AIX support

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5732 c046a42c-6fe2-441c-8c8c-71466251a162
Makefile.target
... ... @@ -763,10 +763,12 @@ endif
763 763 ifndef CONFIG_DARWIN
764 764 ifndef CONFIG_WIN32
765 765 ifndef CONFIG_SOLARIS
  766 +ifndef CONFIG_AIX
766 767 LIBS+=-lutil
767 768 endif
768 769 endif
769 770 endif
  771 +endif
770 772 ifdef TARGET_GPROF
771 773 vl.o: CFLAGS+=-p
772 774 LDFLAGS+=-p
... ...
configure
... ... @@ -32,7 +32,7 @@ ar="ar"
32 32 make="make"
33 33 install="install"
34 34 strip="strip"
35   -cpu=`uname -m`
  35 +cpu=`test $(uname -s) = AIX && uname -p || uname -m`
36 36 target_list=""
37 37 case "$cpu" in
38 38 i386|i486|i586|i686|i86pc|BePC)
... ... @@ -68,7 +68,7 @@ case "$cpu" in
68 68 mips64)
69 69 cpu="mips64"
70 70 ;;
71   - "Power Macintosh"|ppc|ppc64)
  71 + "Power Macintosh"|ppc|ppc64|powerpc)
72 72 cpu="powerpc"
73 73 ;;
74 74 s390*)
... ... @@ -117,6 +117,7 @@ mixemu="no"
117 117 bluez="yes"
118 118 kvm="yes"
119 119 kerneldir=""
  120 +aix="no"
120 121  
121 122 # OS specific
122 123 targetos=`uname -s`
... ... @@ -206,6 +207,10 @@ SunOS)
206 207 fi
207 208 audio_possible_drivers="oss sdl"
208 209 ;;
  210 +AIX)
  211 +aix="yes"
  212 +make="gmake"
  213 +;;
209 214 *)
210 215 audio_drv_list="oss"
211 216 audio_possible_drivers="oss alsa sdl esd pa"
... ... @@ -1220,6 +1225,12 @@ if test "$darwin" = "yes" ; then
1220 1225 echo "CONFIG_DARWIN=yes" >> $config_mak
1221 1226 echo "#define CONFIG_DARWIN 1" >> $config_h
1222 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 1234 if test "$solaris" = "yes" ; then
1224 1235 echo "CONFIG_SOLARIS=yes" >> $config_mak
1225 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 50 typedef uint8_t flag;
51 51 typedef uint8_t uint8;
52 52 typedef int8_t int8;
  53 +#ifndef _AIX
53 54 typedef int uint16;
54 55 typedef int int16;
  56 +#endif
55 57 typedef unsigned int uint32;
56 58 typedef signed int int32;
57 59 typedef uint64_t uint64;
... ...
... ... @@ -780,6 +780,12 @@ static int tap_open(char *ifname, int ifname_size)
780 780 fcntl(fd, F_SETFL, O_NONBLOCK);
781 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 789 #else
784 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 1447 vlan->nb_host_devs++;
1442 1448 ret = tap_win32_init(vlan, ifname);
1443 1449 } else
  1450 +#elif defined (_AIX)
1444 1451 #else
1445 1452 if (!strcmp(device, "tap")) {
1446 1453 char ifname[64];
... ...
tcg/ppc/tcg-target.c
... ... @@ -27,6 +27,9 @@ static uint8_t *tb_ret_addr;
27 27 #ifdef __APPLE__
28 28 #define LINKAGE_AREA_SIZE 24
29 29 #define LR_OFFSET 8
  30 +#elif defined _AIX
  31 +#define LINKAGE_AREA_SIZE 52
  32 +#define LR_OFFSET 8
30 33 #else
31 34 #define LINKAGE_AREA_SIZE 8
32 35 #define LR_OFFSET 4
... ... @@ -137,6 +140,9 @@ static const int tcg_target_callee_save_regs[] = {
137 140 TCG_REG_R11,
138 141 TCG_REG_R13,
139 142 #endif
  143 +#ifdef _AIX
  144 + TCG_REG_R13,
  145 +#endif
140 146 TCG_REG_R14,
141 147 TCG_REG_R15,
142 148 TCG_REG_R16,
... ... @@ -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 482 #if defined(CONFIG_SOFTMMU)
459 483  
460 484 #include "../../softmmu_defs.h"
... ... @@ -548,7 +572,11 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc)
548 572 tcg_out_movi (s, TCG_TYPE_I32, 5, mem_index);
549 573 #endif
550 574  
  575 +#ifdef _AIX
  576 + tcg_out_call (s, (tcg_target_long) qemu_ld_helpers[s_bits], 1);
  577 +#else
551 578 tcg_out_b (s, LK, (tcg_target_long) qemu_ld_helpers[s_bits]);
  579 +#endif
552 580 switch (opc) {
553 581 case 0|4:
554 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 794 ir++;
767 795  
768 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 800 tcg_out_b (s, LK, (tcg_target_long) qemu_st_helpers[opc]);
  801 +#endif
770 802 label2_ptr = s->code_ptr;
771 803 tcg_out32 (s, B);
772 804  
... ... @@ -836,6 +868,16 @@ void tcg_target_qemu_prologue (TCGContext *s)
836 868 ;
837 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 881 tcg_out32 (s, MFSPR | RT (0) | LR);
840 882 tcg_out32 (s, STWU | RS (1) | RA (1) | (-frame_size & 0xffff));
841 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 1148 }
1107 1149 break;
1108 1150 case INDEX_op_call:
  1151 +#ifdef _AIX
  1152 + tcg_out_call (s, args[0], const_args[0]);
  1153 +#else
1109 1154 if (const_args[0]) {
1110 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 1158 tcg_out32 (s, MTSPR | RS (args[0]) | LR);
1114 1159 tcg_out32 (s, BCLR | BO_ALWAYS | LK);
1115 1160 }
  1161 +#endif
1116 1162 break;
1117 1163 case INDEX_op_jmp:
1118 1164 if (const_args[0]) {
... ...
tcg/ppc/tcg-target.h
... ... @@ -65,11 +65,15 @@ enum {
65 65 /* used for function call generation */
66 66 #define TCG_REG_CALL_STACK TCG_REG_R1
67 67 #define TCG_TARGET_STACK_ALIGN 16
68   -#ifdef __APPLE__
  68 +#if defined __APPLE__
69 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 73 #define TCG_TARGET_CALL_ALIGN_ARGS 1
72 74 #define TCG_TARGET_CALL_STACK_OFFSET 8
  75 +#else
  76 +#error Unsupported system
73 77 #endif
74 78  
75 79 /* optional instructions */
... ...
tcg/tcg.c
... ... @@ -37,6 +37,9 @@
37 37 #ifdef _WIN32
38 38 #include <malloc.h>
39 39 #endif
  40 +#ifdef _AIX
  41 +#include <alloca.h>
  42 +#endif
40 43  
41 44 #include "config.h"
42 45 #include "qemu-common.h"
... ...