Commit 67b915a5dd52a05f8030cd9edc005effd9c8eea5

Authored by bellard
1 parent bb27c190

win32 port (initial patch by kazu)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@692 c046a42c-6fe2-441c-8c8c-71466251a162
Changelog
@@ -24,6 +24,7 @@ version 0.5.3: @@ -24,6 +24,7 @@ version 0.5.3:
24 - VM save/restore commands 24 - VM save/restore commands
25 - new timer API 25 - new timer API
26 - more precise RTC emulation (periodic timers + time updates) 26 - more precise RTC emulation (periodic timers + time updates)
  27 + - Win32 port (initial patch by Kazu)
27 28
28 version 0.5.2: 29 version 0.5.2:
29 30
Makefile
1 include config-host.mak 1 include config-host.mak
2 2
3 CFLAGS=-Wall -O2 -g 3 CFLAGS=-Wall -O2 -g
  4 +ifdef CONFIG_WIN32
  5 +CFLAGS+=-fpack-struct
  6 +endif
4 LDFLAGS=-g 7 LDFLAGS=-g
5 LIBS= 8 LIBS=
6 DEFINES+=-D_GNU_SOURCE 9 DEFINES+=-D_GNU_SOURCE
  10 +ifndef CONFIG_WIN32
7 TOOLS=qemu-mkcow 11 TOOLS=qemu-mkcow
  12 +endif
8 13
9 -all: dyngen $(TOOLS) qemu-doc.html qemu.1 14 +all: dyngen$(EXESUF) $(TOOLS) qemu-doc.html qemu.1
10 for d in $(TARGET_DIRS); do \ 15 for d in $(TARGET_DIRS); do \
11 make -C $$d $@ || exit 1 ; \ 16 make -C $$d $@ || exit 1 ; \
12 done 17 done
@@ -14,7 +19,7 @@ all: dyngen $(TOOLS) qemu-doc.html qemu.1 @@ -14,7 +19,7 @@ all: dyngen $(TOOLS) qemu-doc.html qemu.1
14 qemu-mkcow: qemu-mkcow.o 19 qemu-mkcow: qemu-mkcow.o
15 $(HOST_CC) -o $@ $^ $(LIBS) 20 $(HOST_CC) -o $@ $^ $(LIBS)
16 21
17 -dyngen: dyngen.o 22 +dyngen$(EXESUF): dyngen.o
18 $(HOST_CC) -o $@ $^ $(LIBS) 23 $(HOST_CC) -o $@ $^ $(LIBS)
19 24
20 %.o: %.c 25 %.o: %.c
@@ -23,7 +28,7 @@ dyngen: dyngen.o @@ -23,7 +28,7 @@ dyngen: dyngen.o
23 clean: 28 clean:
24 # avoid old build problems by removing potentially incorrect old files 29 # avoid old build problems by removing potentially incorrect old files
25 rm -f config.mak config.h op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h 30 rm -f config.mak config.h op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h
26 - rm -f *.o *.a $(TOOLS) dyngen TAGS qemu.pod 31 + rm -f *.o *.a $(TOOLS) dyngen$(EXESUF) TAGS qemu.pod
27 make -C tests clean 32 make -C tests clean
28 for d in $(TARGET_DIRS); do \ 33 for d in $(TARGET_DIRS); do \
29 make -C $$d $@ || exit 1 ; \ 34 make -C $$d $@ || exit 1 ; \
Makefile.target
@@ -11,12 +11,12 @@ CFLAGS=-Wall -O2 -g @@ -11,12 +11,12 @@ CFLAGS=-Wall -O2 -g
11 LDFLAGS=-g 11 LDFLAGS=-g
12 LIBS= 12 LIBS=
13 HELPER_CFLAGS=$(CFLAGS) 13 HELPER_CFLAGS=$(CFLAGS)
14 -DYNGEN=../dyngen 14 +DYNGEN=../dyngen$(EXESUF)
15 # user emulator name 15 # user emulator name
16 QEMU_USER=qemu-$(TARGET_ARCH) 16 QEMU_USER=qemu-$(TARGET_ARCH)
17 # system emulator name 17 # system emulator name
18 ifdef CONFIG_SOFTMMU 18 ifdef CONFIG_SOFTMMU
19 -QEMU_SYSTEM=qemu 19 +QEMU_SYSTEM=qemu$(EXESUF)
20 else 20 else
21 QEMU_SYSTEM=qemu-fast 21 QEMU_SYSTEM=qemu-fast
22 endif 22 endif
@@ -146,6 +146,9 @@ endif @@ -146,6 +146,9 @@ endif
146 146
147 DEFINES+=-D_GNU_SOURCE 147 DEFINES+=-D_GNU_SOURCE
148 LIBS+=-lm 148 LIBS+=-lm
  149 +ifdef CONFIG_WIN32
  150 +LIBS+=-lwinmm
  151 +endif
149 152
150 # profiling code 153 # profiling code
151 ifdef TARGET_GPROF 154 ifdef TARGET_GPROF
@@ -219,9 +222,12 @@ ifeq ($(ARCH),alpha) @@ -219,9 +222,12 @@ ifeq ($(ARCH),alpha)
219 endif 222 endif
220 223
221 # must use static linking to avoid leaving stuff in virtual address space 224 # must use static linking to avoid leaving stuff in virtual address space
222 -VL_OBJS=vl.o osdep.o block.o monitor.o gdbstub.o \ 225 +VL_OBJS=vl.o osdep.o block.o monitor.o \
223 ide.o ne2000.o pckbd.o vga.o sb16.o dma.o oss.o \ 226 ide.o ne2000.o pckbd.o vga.o sb16.o dma.o oss.o \
224 fdc.o mc146818rtc.o serial.o i8259.o i8254.o pc.o 227 fdc.o mc146818rtc.o serial.o i8259.o i8254.o pc.o
  228 +ifdef CONFIG_GDBSTUB
  229 +VL_OBJS+=gdbstub.o
  230 +endif
225 ifeq ($(TARGET_ARCH), ppc) 231 ifeq ($(TARGET_ARCH), ppc)
226 VL_OBJS+= hw.o 232 VL_OBJS+= hw.o
227 endif 233 endif
1 short term: 1 short term:
2 ---------- 2 ----------
  3 +- handle fast timers + add explicit clocks
  4 +- OS/2 install bug
  5 +- win 95 install bug
  6 +- handle Self Modifying Code even if modifying current TB (BE OS 5 install)
3 - physical memory cache (reduce qemu-fast address space size to about 32 MB) 7 - physical memory cache (reduce qemu-fast address space size to about 32 MB)
4 - better code fetch 8 - better code fetch
5 - XP security bug 9 - XP security bug
6 -- handle Self Modifying Code even if modifying current TB (BE OS 5 install)  
7 - cycle counter for all archs 10 - cycle counter for all archs
8 - TLB code protection support for PPC 11 - TLB code protection support for PPC
9 - add sysenter/sysexit and fxsr for L4 pistachio 686 12 - add sysenter/sysexit and fxsr for L4 pistachio 686
@@ -21,29 +21,11 @@ @@ -21,29 +21,11 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdlib.h>  
25 -#include <stdio.h>  
26 -#include <stdarg.h>  
27 -#include <string.h>  
28 -#include <getopt.h>  
29 -#include <inttypes.h>  
30 -#include <unistd.h>  
31 -#include <sys/mman.h>  
32 -#include <fcntl.h>  
33 -#include <signal.h>  
34 -#include <time.h>  
35 -#include <sys/time.h>  
36 -#include <malloc.h>  
37 -#include <termios.h>  
38 -#include <sys/poll.h>  
39 -#include <errno.h>  
40 -#include <sys/wait.h>  
41 -#include <netinet/in.h>  
42 -  
43 #include "vl.h" 24 #include "vl.h"
44 25
45 -#define NO_THUNK_TYPE_SIZE  
46 -#include "thunk.h" 26 +#ifndef _WIN32
  27 +#include <sys/mman.h>
  28 +#endif
47 29
48 #include "cow.h" 30 #include "cow.h"
49 31
@@ -97,11 +79,14 @@ BlockDriverState *bdrv_new(const char *device_name) @@ -97,11 +79,14 @@ BlockDriverState *bdrv_new(const char *device_name)
97 79
98 int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot) 80 int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot)
99 { 81 {
100 - int fd, cow_fd; 82 + int fd;
101 int64_t size; 83 int64_t size;
102 - char template[] = "/tmp/vl.XXXXXX";  
103 struct cow_header_v2 cow_header; 84 struct cow_header_v2 cow_header;
  85 +#ifndef _WIN32
  86 + char template[] = "/tmp/vl.XXXXXX";
  87 + int cow_fd;
104 struct stat st; 88 struct stat st;
  89 +#endif
105 90
106 bs->read_only = 0; 91 bs->read_only = 0;
107 bs->fd = -1; 92 bs->fd = -1;
@@ -110,10 +95,18 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot) @@ -110,10 +95,18 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot)
110 strcpy(bs->filename, filename); 95 strcpy(bs->filename, filename);
111 96
112 /* open standard HD image */ 97 /* open standard HD image */
  98 +#ifdef _WIN32
  99 + fd = open(filename, O_RDWR | O_BINARY);
  100 +#else
113 fd = open(filename, O_RDWR | O_LARGEFILE); 101 fd = open(filename, O_RDWR | O_LARGEFILE);
  102 +#endif
114 if (fd < 0) { 103 if (fd < 0) {
115 /* read only image on disk */ 104 /* read only image on disk */
  105 +#ifdef _WIN32
  106 + fd = open(filename, O_RDONLY | O_BINARY);
  107 +#else
116 fd = open(filename, O_RDONLY | O_LARGEFILE); 108 fd = open(filename, O_RDONLY | O_LARGEFILE);
  109 +#endif
117 if (fd < 0) { 110 if (fd < 0) {
118 perror(filename); 111 perror(filename);
119 goto fail; 112 goto fail;
@@ -128,8 +121,9 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot) @@ -128,8 +121,9 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot)
128 fprintf(stderr, "%s: could not read header\n", filename); 121 fprintf(stderr, "%s: could not read header\n", filename);
129 goto fail; 122 goto fail;
130 } 123 }
131 - if (cow_header.magic == htonl(COW_MAGIC) &&  
132 - cow_header.version == htonl(COW_VERSION)) { 124 +#ifndef _WIN32
  125 + if (be32_to_cpu(cow_header.magic) == COW_MAGIC &&
  126 + be32_to_cpu(cow_header.version) == COW_VERSION) {
133 /* cow image found */ 127 /* cow image found */
134 size = cow_header.size; 128 size = cow_header.size;
135 #ifndef WORDS_BIGENDIAN 129 #ifndef WORDS_BIGENDIAN
@@ -144,7 +138,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot) @@ -144,7 +138,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot)
144 fprintf(stderr, "%s: could not find original disk image '%s'\n", filename, cow_header.backing_file); 138 fprintf(stderr, "%s: could not find original disk image '%s'\n", filename, cow_header.backing_file);
145 goto fail; 139 goto fail;
146 } 140 }
147 - if (st.st_mtime != htonl(cow_header.mtime)) { 141 + if (st.st_mtime != be32_to_cpu(cow_header.mtime)) {
148 fprintf(stderr, "%s: original raw disk image '%s' does not match saved timestamp\n", filename, cow_header.backing_file); 142 fprintf(stderr, "%s: original raw disk image '%s' does not match saved timestamp\n", filename, cow_header.backing_file);
149 goto fail; 143 goto fail;
150 } 144 }
@@ -164,13 +158,16 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot) @@ -164,13 +158,16 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot)
164 bs->cow_bitmap = bs->cow_bitmap_addr + sizeof(cow_header); 158 bs->cow_bitmap = bs->cow_bitmap_addr + sizeof(cow_header);
165 bs->cow_sectors_offset = (bs->cow_bitmap_size + 511) & ~511; 159 bs->cow_sectors_offset = (bs->cow_bitmap_size + 511) & ~511;
166 snapshot = 0; 160 snapshot = 0;
167 - } else { 161 + } else
  162 +#endif
  163 + {
168 /* standard raw image */ 164 /* standard raw image */
169 size = lseek64(fd, 0, SEEK_END); 165 size = lseek64(fd, 0, SEEK_END);
170 bs->total_sectors = size / 512; 166 bs->total_sectors = size / 512;
171 bs->fd = fd; 167 bs->fd = fd;
172 } 168 }
173 169
  170 +#ifndef _WIN32
174 if (snapshot) { 171 if (snapshot) {
175 /* create a temporary COW file */ 172 /* create a temporary COW file */
176 cow_fd = mkstemp(template); 173 cow_fd = mkstemp(template);
@@ -190,6 +187,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot) @@ -190,6 +187,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot)
190 bs->cow_bitmap = bs->cow_bitmap_addr; 187 bs->cow_bitmap = bs->cow_bitmap_addr;
191 bs->cow_sectors_offset = 0; 188 bs->cow_sectors_offset = 0;
192 } 189 }
  190 +#endif
193 191
194 bs->inserted = 1; 192 bs->inserted = 1;
195 193
@@ -206,9 +204,11 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot) @@ -206,9 +204,11 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot)
206 void bdrv_close(BlockDriverState *bs) 204 void bdrv_close(BlockDriverState *bs)
207 { 205 {
208 if (bs->inserted) { 206 if (bs->inserted) {
  207 +#ifndef _WIN32
209 /* we unmap the mapping so that it is written to the COW file */ 208 /* we unmap the mapping so that it is written to the COW file */
210 if (bs->cow_bitmap_addr) 209 if (bs->cow_bitmap_addr)
211 munmap(bs->cow_bitmap_addr, bs->cow_bitmap_size); 210 munmap(bs->cow_bitmap_addr, bs->cow_bitmap_size);
  211 +#endif
212 if (bs->cow_fd >= 0) 212 if (bs->cow_fd >= 0)
213 close(bs->cow_fd); 213 close(bs->cow_fd);
214 if (bs->fd >= 0) 214 if (bs->fd >= 0)
configure
@@ -68,10 +68,16 @@ case &quot;$cpu&quot; in @@ -68,10 +68,16 @@ case &quot;$cpu&quot; in
68 esac 68 esac
69 gprof="no" 69 gprof="no"
70 bigendian="no" 70 bigendian="no"
  71 +mingw32="no"
  72 +EXESUF=""
  73 +gdbstub="yes"
71 74
72 # OS specific 75 # OS specific
73 targetos=`uname -s` 76 targetos=`uname -s`
74 case $targetos in 77 case $targetos in
  78 +MINGW32*)
  79 +mingw32="yes"
  80 +;;
75 *) ;; 81 *) ;;
76 esac 82 esac
77 83
@@ -136,6 +142,8 @@ for opt do @@ -136,6 +142,8 @@ for opt do
136 ;; 142 ;;
137 --disable-sdl) sdl="no" 143 --disable-sdl) sdl="no"
138 ;; 144 ;;
  145 + --enable-mingw32) mingw32="yes" ; cross_prefix="i386-mingw32-"
  146 + ;;
139 esac 147 esac
140 done 148 done
141 149
@@ -148,6 +156,14 @@ cc=&quot;${cross_prefix}${cc}&quot; @@ -148,6 +156,14 @@ cc=&quot;${cross_prefix}${cc}&quot;
148 ar="${cross_prefix}${ar}" 156 ar="${cross_prefix}${ar}"
149 strip="${cross_prefix}${strip}" 157 strip="${cross_prefix}${strip}"
150 158
  159 +if test "$mingw32" = "yes" ; then
  160 + host_cc="$cc"
  161 + target_list="i386-softmmu"
  162 + prefix="/c/Program Files/Qemu"
  163 + EXESUF=".exe"
  164 + gdbstub="no"
  165 +fi
  166 +
151 if test -z "$cross_prefix" ; then 167 if test -z "$cross_prefix" ; then
152 168
153 # --- 169 # ---
@@ -206,6 +222,7 @@ echo &quot; --cross-prefix=PREFIX use PREFIX for compile tools [$cross_prefix]&quot; @@ -206,6 +222,7 @@ echo &quot; --cross-prefix=PREFIX use PREFIX for compile tools [$cross_prefix]&quot;
206 echo " --cc=CC use C compiler CC [$cc]" 222 echo " --cc=CC use C compiler CC [$cc]"
207 echo " --make=MAKE use specified make [$make]" 223 echo " --make=MAKE use specified make [$make]"
208 echo " --static enable static build [$static]" 224 echo " --static enable static build [$static]"
  225 +echo " --enable-mingw32 enable Win32 cross compilation with mingw32"
209 echo "" 226 echo ""
210 echo "NOTE: The object files are build at the place where configure is launched" 227 echo "NOTE: The object files are build at the place where configure is launched"
211 exit 1 228 exit 1
@@ -227,6 +244,8 @@ echo &quot;target list $target_list&quot; @@ -227,6 +244,8 @@ echo &quot;target list $target_list&quot;
227 echo "gprof enabled $gprof" 244 echo "gprof enabled $gprof"
228 echo "static build $static" 245 echo "static build $static"
229 echo "SDL support $sdl" 246 echo "SDL support $sdl"
  247 +echo "mingw32 support $mingw32"
  248 +
230 if test $sdl_too_old = "yes"; then 249 if test $sdl_too_old = "yes"; then
231 echo "-> Your SDL version is too old - please upgrade to have FFplay/SDL support" 250 echo "-> Your SDL version is too old - please upgrade to have FFplay/SDL support"
232 fi 251 fi
@@ -253,6 +272,7 @@ echo &quot;AR=$ar&quot; &gt;&gt; $config_mak @@ -253,6 +272,7 @@ echo &quot;AR=$ar&quot; &gt;&gt; $config_mak
253 echo "STRIP=$strip -s -R .comment -R .note" >> $config_mak 272 echo "STRIP=$strip -s -R .comment -R .note" >> $config_mak
254 echo "CFLAGS=$CFLAGS" >> $config_mak 273 echo "CFLAGS=$CFLAGS" >> $config_mak
255 echo "LDFLAGS=$LDFLAGS" >> $config_mak 274 echo "LDFLAGS=$LDFLAGS" >> $config_mak
  275 +echo "EXESUF=$EXESUF" >> $config_mak
256 if test "$cpu" = "i386" ; then 276 if test "$cpu" = "i386" ; then
257 echo "ARCH=i386" >> $config_mak 277 echo "ARCH=i386" >> $config_mak
258 echo "#define HOST_I386 1" >> $config_h 278 echo "#define HOST_I386 1" >> $config_h
@@ -294,7 +314,15 @@ if test &quot;$bigendian&quot; = &quot;yes&quot; ; then @@ -294,7 +314,15 @@ if test &quot;$bigendian&quot; = &quot;yes&quot; ; then
294 echo "WORDS_BIGENDIAN=yes" >> $config_mak 314 echo "WORDS_BIGENDIAN=yes" >> $config_mak
295 echo "#define WORDS_BIGENDIAN 1" >> $config_h 315 echo "#define WORDS_BIGENDIAN 1" >> $config_h
296 fi 316 fi
297 -echo "#define HAVE_BYTESWAP_H 1" >> $config_h 317 +if test "$mingw32" = "yes" ; then
  318 + echo "CONFIG_WIN32=yes" >> $config_mak
  319 +else
  320 + echo "#define HAVE_BYTESWAP_H 1" >> $config_h
  321 +fi
  322 +if test "$gdbstub" = "yes" ; then
  323 + echo "CONFIG_GDBSTUB=yes" >> $config_mak
  324 + echo "#define CONFIG_GDBSTUB 1" >> $config_h
  325 +fi
298 if test "$gprof" = "yes" ; then 326 if test "$gprof" = "yes" ; then
299 echo "TARGET_GPROF=yes" >> $config_mak 327 echo "TARGET_GPROF=yes" >> $config_mak
300 echo "#define HAVE_GPROF 1" >> $config_h 328 echo "#define HAVE_GPROF 1" >> $config_h
cpu-exec.c
@@ -592,6 +592,8 @@ void cpu_x86_frstor(CPUX86State *s, uint8_t *ptr, int data32) @@ -592,6 +592,8 @@ void cpu_x86_frstor(CPUX86State *s, uint8_t *ptr, int data32)
592 592
593 #endif /* TARGET_I386 */ 593 #endif /* TARGET_I386 */
594 594
  595 +#if !defined(CONFIG_SOFTMMU)
  596 +
595 #undef EAX 597 #undef EAX
596 #undef ECX 598 #undef ECX
597 #undef EDX 599 #undef EDX
@@ -925,3 +927,5 @@ int cpu_signal_handler(int host_signum, struct siginfo *info, @@ -925,3 +927,5 @@ int cpu_signal_handler(int host_signum, struct siginfo *info,
925 #error host CPU specific signal handler needed 927 #error host CPU specific signal handler needed
926 928
927 #endif 929 #endif
  930 +
  931 +#endif /* !defined(CONFIG_SOFTMMU) */
dyngen.c
@@ -3,6 +3,9 @@ @@ -3,6 +3,9 @@
3 * 3 *
4 * Copyright (c) 2003 Fabrice Bellard 4 * Copyright (c) 2003 Fabrice Bellard
5 * 5 *
  6 + * The COFF object format support was extracted from Kazu's QEMU port
  7 + * to Win32.
  8 + *
6 * This program is free software; you can redistribute it and/or modify 9 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by 10 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or 11 * the Free Software Foundation; either version 2 of the License, or
@@ -27,6 +30,14 @@ @@ -27,6 +30,14 @@
27 30
28 #include "config-host.h" 31 #include "config-host.h"
29 32
  33 +#if defined(_WIN32)
  34 +#define CONFIG_FORMAT_COFF
  35 +#else
  36 +#define CONFIG_FORMAT_ELF
  37 +#endif
  38 +
  39 +#ifdef CONFIG_FORMAT_ELF
  40 +
30 /* elf format definitions. We use these macros to test the CPU to 41 /* elf format definitions. We use these macros to test the CPU to
31 allow cross compilation (this tool must be ran on the build 42 allow cross compilation (this tool must be ran on the build
32 platform) */ 43 platform) */
@@ -122,6 +133,40 @@ typedef uint64_t host_ulong; @@ -122,6 +133,40 @@ typedef uint64_t host_ulong;
122 #define SHT_RELOC SHT_REL 133 #define SHT_RELOC SHT_REL
123 #endif 134 #endif
124 135
  136 +#define EXE_RELOC ELF_RELOC
  137 +#define EXE_SYM ElfW(Sym)
  138 +
  139 +#endif /* CONFIG_FORMAT_ELF */
  140 +
  141 +#ifdef CONFIG_FORMAT_COFF
  142 +
  143 +#include "a.out.h"
  144 +
  145 +typedef int32_t host_long;
  146 +typedef uint32_t host_ulong;
  147 +
  148 +#define FILENAMELEN 256
  149 +
  150 +typedef struct coff_sym {
  151 + struct external_syment *st_syment;
  152 + char st_name[FILENAMELEN];
  153 + uint32_t st_value;
  154 + int st_size;
  155 + uint8_t st_type;
  156 + uint8_t st_shndx;
  157 +} coff_Sym;
  158 +
  159 +typedef struct coff_rel {
  160 + struct external_reloc *r_reloc;
  161 + int r_offset;
  162 + uint8_t r_type;
  163 +} coff_Rel;
  164 +
  165 +#define EXE_RELOC struct coff_rel
  166 +#define EXE_SYM struct coff_sym
  167 +
  168 +#endif /* CONFIG_FORMAT_COFF */
  169 +
125 #include "bswap.h" 170 #include "bswap.h"
126 171
127 enum { 172 enum {
@@ -133,18 +178,67 @@ enum { @@ -133,18 +178,67 @@ enum {
133 /* all dynamically generated functions begin with this code */ 178 /* all dynamically generated functions begin with this code */
134 #define OP_PREFIX "op_" 179 #define OP_PREFIX "op_"
135 180
136 -int elf_must_swap(struct elfhdr *h) 181 +int do_swap;
  182 +
  183 +void __attribute__((noreturn)) __attribute__((format (printf, 1, 2))) error(const char *fmt, ...)
137 { 184 {
138 - union {  
139 - uint32_t i;  
140 - uint8_t b[4];  
141 - } swaptest; 185 + va_list ap;
  186 + va_start(ap, fmt);
  187 + fprintf(stderr, "dyngen: ");
  188 + vfprintf(stderr, fmt, ap);
  189 + fprintf(stderr, "\n");
  190 + va_end(ap);
  191 + exit(1);
  192 +}
142 193
143 - swaptest.i = 1;  
144 - return (h->e_ident[EI_DATA] == ELFDATA2MSB) !=  
145 - (swaptest.b[0] == 0); 194 +void *load_data(int fd, long offset, unsigned int size)
  195 +{
  196 + char *data;
  197 +
  198 + data = malloc(size);
  199 + if (!data)
  200 + return NULL;
  201 + lseek(fd, offset, SEEK_SET);
  202 + if (read(fd, data, size) != size) {
  203 + free(data);
  204 + return NULL;
  205 + }
  206 + return data;
146 } 207 }
147 - 208 +
  209 +int strstart(const char *str, const char *val, const char **ptr)
  210 +{
  211 + const char *p, *q;
  212 + p = str;
  213 + q = val;
  214 + while (*q != '\0') {
  215 + if (*p != *q)
  216 + return 0;
  217 + p++;
  218 + q++;
  219 + }
  220 + if (ptr)
  221 + *ptr = p;
  222 + return 1;
  223 +}
  224 +
  225 +void pstrcpy(char *buf, int buf_size, const char *str)
  226 +{
  227 + int c;
  228 + char *q = buf;
  229 +
  230 + if (buf_size <= 0)
  231 + return;
  232 +
  233 + for(;;) {
  234 + c = *str++;
  235 + if (c == 0 || q >= buf + buf_size - 1)
  236 + break;
  237 + *q++ = c;
  238 + }
  239 + *q = '\0';
  240 +}
  241 +
148 void swab16s(uint16_t *p) 242 void swab16s(uint16_t *p)
149 { 243 {
150 *p = bswap16(*p); 244 *p = bswap16(*p);
@@ -160,6 +254,66 @@ void swab64s(uint64_t *p) @@ -160,6 +254,66 @@ void swab64s(uint64_t *p)
160 *p = bswap64(*p); 254 *p = bswap64(*p);
161 } 255 }
162 256
  257 +uint16_t get16(uint16_t *p)
  258 +{
  259 + uint16_t val;
  260 + val = *p;
  261 + if (do_swap)
  262 + val = bswap16(val);
  263 + return val;
  264 +}
  265 +
  266 +uint32_t get32(uint32_t *p)
  267 +{
  268 + uint32_t val;
  269 + val = *p;
  270 + if (do_swap)
  271 + val = bswap32(val);
  272 + return val;
  273 +}
  274 +
  275 +void put16(uint16_t *p, uint16_t val)
  276 +{
  277 + if (do_swap)
  278 + val = bswap16(val);
  279 + *p = val;
  280 +}
  281 +
  282 +void put32(uint32_t *p, uint32_t val)
  283 +{
  284 + if (do_swap)
  285 + val = bswap32(val);
  286 + *p = val;
  287 +}
  288 +
  289 +/* executable information */
  290 +EXE_SYM *symtab;
  291 +int nb_syms;
  292 +int text_shndx;
  293 +uint8_t *text;
  294 +EXE_RELOC *relocs;
  295 +int nb_relocs;
  296 +
  297 +#ifdef CONFIG_FORMAT_ELF
  298 +
  299 +/* ELF file info */
  300 +struct elf_shdr *shdr;
  301 +uint8_t **sdata;
  302 +struct elfhdr ehdr;
  303 +char *strtab;
  304 +
  305 +int elf_must_swap(struct elfhdr *h)
  306 +{
  307 + union {
  308 + uint32_t i;
  309 + uint8_t b[4];
  310 + } swaptest;
  311 +
  312 + swaptest.i = 1;
  313 + return (h->e_ident[EI_DATA] == ELFDATA2MSB) !=
  314 + (swaptest.b[0] == 0);
  315 +}
  316 +
163 void elf_swap_ehdr(struct elfhdr *h) 317 void elf_swap_ehdr(struct elfhdr *h)
164 { 318 {
165 swab16s(&h->e_type); /* Object file type */ 319 swab16s(&h->e_type); /* Object file type */
@@ -212,122 +366,396 @@ void elf_swap_rel(ELF_RELOC *rel) @@ -212,122 +366,396 @@ void elf_swap_rel(ELF_RELOC *rel)
212 #endif 366 #endif
213 } 367 }
214 368
215 -/* ELF file info */  
216 -int do_swap;  
217 -struct elf_shdr *shdr;  
218 -uint8_t **sdata;  
219 -struct elfhdr ehdr;  
220 -ElfW(Sym) *symtab;  
221 -int nb_syms;  
222 -char *strtab;  
223 -int text_shndx; 369 +struct elf_shdr *find_elf_section(struct elf_shdr *shdr, int shnum, const char *shstr,
  370 + const char *name)
  371 +{
  372 + int i;
  373 + const char *shname;
  374 + struct elf_shdr *sec;
224 375
225 -uint16_t get16(uint16_t *p) 376 + for(i = 0; i < shnum; i++) {
  377 + sec = &shdr[i];
  378 + if (!sec->sh_name)
  379 + continue;
  380 + shname = shstr + sec->sh_name;
  381 + if (!strcmp(shname, name))
  382 + return sec;
  383 + }
  384 + return NULL;
  385 +}
  386 +
  387 +int find_reloc(int sh_index)
226 { 388 {
227 - uint16_t val;  
228 - val = *p;  
229 - if (do_swap)  
230 - val = bswap16(val);  
231 - return val; 389 + struct elf_shdr *sec;
  390 + int i;
  391 +
  392 + for(i = 0; i < ehdr.e_shnum; i++) {
  393 + sec = &shdr[i];
  394 + if (sec->sh_type == SHT_RELOC && sec->sh_info == sh_index)
  395 + return i;
  396 + }
  397 + return 0;
232 } 398 }
233 399
234 -uint32_t get32(uint32_t *p) 400 +static char *get_rel_sym_name(EXE_RELOC *rel)
235 { 401 {
236 - uint32_t val;  
237 - val = *p; 402 + return strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name;
  403 +}
  404 +
  405 +static char *get_sym_name(EXE_SYM *sym)
  406 +{
  407 + return strtab + sym->st_name;
  408 +}
  409 +
  410 +/* load an elf object file */
  411 +int load_object(const char *filename)
  412 +{
  413 + int fd;
  414 + struct elf_shdr *sec, *symtab_sec, *strtab_sec, *text_sec;
  415 + int i, j;
  416 + ElfW(Sym) *sym;
  417 + char *shstr;
  418 + ELF_RELOC *rel;
  419 +
  420 + fd = open(filename, O_RDONLY);
  421 + if (fd < 0)
  422 + error("can't open file '%s'", filename);
  423 +
  424 + /* Read ELF header. */
  425 + if (read(fd, &ehdr, sizeof (ehdr)) != sizeof (ehdr))
  426 + error("unable to read file header");
  427 +
  428 + /* Check ELF identification. */
  429 + if (ehdr.e_ident[EI_MAG0] != ELFMAG0
  430 + || ehdr.e_ident[EI_MAG1] != ELFMAG1
  431 + || ehdr.e_ident[EI_MAG2] != ELFMAG2
  432 + || ehdr.e_ident[EI_MAG3] != ELFMAG3
  433 + || ehdr.e_ident[EI_VERSION] != EV_CURRENT) {
  434 + error("bad ELF header");
  435 + }
  436 +
  437 + do_swap = elf_must_swap(&ehdr);
238 if (do_swap) 438 if (do_swap)
239 - val = bswap32(val);  
240 - return val; 439 + elf_swap_ehdr(&ehdr);
  440 + if (ehdr.e_ident[EI_CLASS] != ELF_CLASS)
  441 + error("Unsupported ELF class");
  442 + if (ehdr.e_type != ET_REL)
  443 + error("ELF object file expected");
  444 + if (ehdr.e_version != EV_CURRENT)
  445 + error("Invalid ELF version");
  446 + if (!elf_check_arch(ehdr.e_machine))
  447 + error("Unsupported CPU (e_machine=%d)", ehdr.e_machine);
  448 +
  449 + /* read section headers */
  450 + shdr = load_data(fd, ehdr.e_shoff, ehdr.e_shnum * sizeof(struct elf_shdr));
  451 + if (do_swap) {
  452 + for(i = 0; i < ehdr.e_shnum; i++) {
  453 + elf_swap_shdr(&shdr[i]);
  454 + }
  455 + }
  456 +
  457 + /* read all section data */
  458 + sdata = malloc(sizeof(void *) * ehdr.e_shnum);
  459 + memset(sdata, 0, sizeof(void *) * ehdr.e_shnum);
  460 +
  461 + for(i = 0;i < ehdr.e_shnum; i++) {
  462 + sec = &shdr[i];
  463 + if (sec->sh_type != SHT_NOBITS)
  464 + sdata[i] = load_data(fd, sec->sh_offset, sec->sh_size);
  465 + }
  466 +
  467 + sec = &shdr[ehdr.e_shstrndx];
  468 + shstr = sdata[ehdr.e_shstrndx];
  469 +
  470 + /* swap relocations */
  471 + for(i = 0; i < ehdr.e_shnum; i++) {
  472 + sec = &shdr[i];
  473 + if (sec->sh_type == SHT_RELOC) {
  474 + nb_relocs = sec->sh_size / sec->sh_entsize;
  475 + if (do_swap) {
  476 + for(j = 0, rel = (ELF_RELOC *)sdata[i]; j < nb_relocs; j++, rel++)
  477 + elf_swap_rel(rel);
  478 + }
  479 + }
  480 + }
  481 + /* text section */
  482 +
  483 + text_sec = find_elf_section(shdr, ehdr.e_shnum, shstr, ".text");
  484 + if (!text_sec)
  485 + error("could not find .text section");
  486 + text_shndx = text_sec - shdr;
  487 + text = sdata[text_shndx];
  488 +
  489 + /* find text relocations, if any */
  490 + relocs = NULL;
  491 + nb_relocs = 0;
  492 + i = find_reloc(text_shndx);
  493 + if (i != 0) {
  494 + relocs = (ELF_RELOC *)sdata[i];
  495 + nb_relocs = shdr[i].sh_size / shdr[i].sh_entsize;
  496 + }
  497 +
  498 + symtab_sec = find_elf_section(shdr, ehdr.e_shnum, shstr, ".symtab");
  499 + if (!symtab_sec)
  500 + error("could not find .symtab section");
  501 + strtab_sec = &shdr[symtab_sec->sh_link];
  502 +
  503 + symtab = (ElfW(Sym) *)sdata[symtab_sec - shdr];
  504 + strtab = sdata[symtab_sec->sh_link];
  505 +
  506 + nb_syms = symtab_sec->sh_size / sizeof(ElfW(Sym));
  507 + if (do_swap) {
  508 + for(i = 0, sym = symtab; i < nb_syms; i++, sym++) {
  509 + swab32s(&sym->st_name);
  510 + swabls(&sym->st_value);
  511 + swabls(&sym->st_size);
  512 + swab16s(&sym->st_shndx);
  513 + }
  514 + }
  515 + close(fd);
  516 + return 0;
  517 +}
  518 +
  519 +#endif /* CONFIG_FORMAT_ELF */
  520 +
  521 +#ifdef CONFIG_FORMAT_COFF
  522 +
  523 +/* COFF file info */
  524 +struct external_scnhdr *shdr;
  525 +uint8_t **sdata;
  526 +struct external_filehdr fhdr;
  527 +struct external_syment *coff_symtab;
  528 +char *strtab;
  529 +int coff_text_shndx, coff_data_shndx;
  530 +
  531 +int data_shndx;
  532 +
  533 +#define STRTAB_SIZE 4
  534 +
  535 +#define DIR32 0x06
  536 +#define DISP32 0x14
  537 +
  538 +#define T_FUNCTION 0x20
  539 +#define C_EXTERNAL 2
  540 +
  541 +void sym_ent_name(struct external_syment *ext_sym, EXE_SYM *sym)
  542 +{
  543 + char *q;
  544 + int c, i, len;
  545 +
  546 + if (ext_sym->e.e.e_zeroes != 0) {
  547 + q = sym->st_name;
  548 + for(i = 0; i < 8; i++) {
  549 + c = ext_sym->e.e_name[i];
  550 + if (c == '\0')
  551 + break;
  552 + *q++ = c;
  553 + }
  554 + *q = '\0';
  555 + } else {
  556 + pstrcpy(sym->st_name, sizeof(sym->st_name), strtab + ext_sym->e.e.e_offset);
  557 + }
  558 +
  559 + /* now convert the name to a C name (suppress the leading '_') */
  560 + if (sym->st_name[0] == '_') {
  561 + len = strlen(sym->st_name);
  562 + memmove(sym->st_name, sym->st_name + 1, len - 1);
  563 + sym->st_name[len - 1] = '\0';
  564 + }
241 } 565 }
242 566
243 -void put16(uint16_t *p, uint16_t val) 567 +char *name_for_dotdata(struct coff_rel *rel)
244 { 568 {
245 - if (do_swap)  
246 - val = bswap16(val);  
247 - *p = val; 569 + int i;
  570 + struct coff_sym *sym;
  571 + uint32_t text_data;
  572 +
  573 + text_data = *(uint32_t *)(text + rel->r_offset);
  574 +
  575 + for (i = 0, sym = symtab; i < nb_syms; i++, sym++) {
  576 + if (sym->st_syment->e_scnum == data_shndx &&
  577 + text_data >= sym->st_value &&
  578 + text_data < sym->st_value + sym->st_size) {
  579 +
  580 + return sym->st_name;
  581 +
  582 + }
  583 + }
  584 + return NULL;
248 } 585 }
249 586
250 -void put32(uint32_t *p, uint32_t val) 587 +static char *get_sym_name(EXE_SYM *sym)
251 { 588 {
252 - if (do_swap)  
253 - val = bswap32(val);  
254 - *p = val; 589 + return sym->st_name;
255 } 590 }
256 591
257 -void __attribute__((noreturn)) __attribute__((format (printf, 1, 2))) error(const char *fmt, ...) 592 +static char *get_rel_sym_name(EXE_RELOC *rel)
258 { 593 {
259 - va_list ap;  
260 - va_start(ap, fmt);  
261 - fprintf(stderr, "dyngen: ");  
262 - vfprintf(stderr, fmt, ap);  
263 - fprintf(stderr, "\n");  
264 - va_end(ap);  
265 - exit(1); 594 + char *name;
  595 + name = get_sym_name(symtab + *(uint32_t *)(rel->r_reloc->r_symndx));
  596 + if (!strcmp(name, ".data"))
  597 + name = name_for_dotdata(rel);
  598 + return name;
266 } 599 }
267 600
268 -  
269 -struct elf_shdr *find_elf_section(struct elf_shdr *shdr, int shnum, const char *shstr,  
270 - const char *name) 601 +struct external_scnhdr *find_coff_section(struct external_scnhdr *shdr, int shnum, const char *name)
271 { 602 {
272 int i; 603 int i;
273 const char *shname; 604 const char *shname;
274 - struct elf_shdr *sec; 605 + struct external_scnhdr *sec;
275 606
276 for(i = 0; i < shnum; i++) { 607 for(i = 0; i < shnum; i++) {
277 sec = &shdr[i]; 608 sec = &shdr[i];
278 - if (!sec->sh_name) 609 + if (!sec->s_name)
279 continue; 610 continue;
280 - shname = shstr + sec->sh_name; 611 + shname = sec->s_name;
281 if (!strcmp(shname, name)) 612 if (!strcmp(shname, name))
282 return sec; 613 return sec;
283 } 614 }
284 return NULL; 615 return NULL;
285 } 616 }
286 617
287 -int find_reloc(int sh_index) 618 +/* load a coff object file */
  619 +int load_object(const char *filename)
288 { 620 {
289 - struct elf_shdr *sec; 621 + int fd;
  622 + struct external_scnhdr *sec, *text_sec, *data_sec;
290 int i; 623 int i;
  624 + struct external_syment *ext_sym;
  625 + struct external_reloc *coff_relocs;
  626 + struct external_reloc *ext_rel;
  627 + uint32_t *n_strtab;
  628 + EXE_SYM *sym;
  629 + EXE_RELOC *rel;
  630 +
  631 + fd = open(filename, O_RDONLY
  632 +#ifdef _WIN32
  633 + | O_BINARY
  634 +#endif
  635 + );
  636 + if (fd < 0)
  637 + error("can't open file '%s'", filename);
  638 +
  639 + /* Read COFF header. */
  640 + if (read(fd, &fhdr, sizeof (fhdr)) != sizeof (fhdr))
  641 + error("unable to read file header");
291 642
292 - for(i = 0; i < ehdr.e_shnum; i++) { 643 + /* Check COFF identification. */
  644 + if (fhdr.f_magic != I386MAGIC) {
  645 + error("bad COFF header");
  646 + }
  647 + do_swap = 0;
  648 +
  649 + /* read section headers */
  650 + shdr = load_data(fd, sizeof(struct external_filehdr) + fhdr.f_opthdr, fhdr.f_nscns * sizeof(struct external_scnhdr));
  651 +
  652 + /* read all section data */
  653 + sdata = malloc(sizeof(void *) * fhdr.f_nscns);
  654 + memset(sdata, 0, sizeof(void *) * fhdr.f_nscns);
  655 +
  656 + const char *p;
  657 + for(i = 0;i < fhdr.f_nscns; i++) {
293 sec = &shdr[i]; 658 sec = &shdr[i];
294 - if (sec->sh_type == SHT_RELOC && sec->sh_info == sh_index)  
295 - return i; 659 + if (!strstart(sec->s_name, ".bss", &p))
  660 + sdata[i] = load_data(fd, sec->s_scnptr, sec->s_size);
296 } 661 }
297 - return 0;  
298 -}  
299 662
300 -void *load_data(int fd, long offset, unsigned int size)  
301 -{  
302 - char *data;  
303 663
304 - data = malloc(size);  
305 - if (!data)  
306 - return NULL;  
307 - lseek(fd, offset, SEEK_SET);  
308 - if (read(fd, data, size) != size) {  
309 - free(data);  
310 - return NULL; 664 + /* text section */
  665 + text_sec = find_coff_section(shdr, fhdr.f_nscns, ".text");
  666 + if (!text_sec)
  667 + error("could not find .text section");
  668 + coff_text_shndx = text_sec - shdr;
  669 + text = sdata[coff_text_shndx];
  670 +
  671 + /* data section */
  672 + data_sec = find_coff_section(shdr, fhdr.f_nscns, ".data");
  673 + if (!data_sec)
  674 + error("could not find .data section");
  675 + coff_data_shndx = data_sec - shdr;
  676 +
  677 + coff_symtab = load_data(fd, fhdr.f_symptr, fhdr.f_nsyms*SYMESZ);
  678 + for (i = 0, ext_sym = coff_symtab; i < nb_syms; i++, ext_sym++) {
  679 + for(i=0;i<8;i++)
  680 + printf(" %02x", ((uint8_t *)ext_sym->e.e_name)[i]);
  681 + printf("\n");
311 } 682 }
312 - return data;  
313 -}  
314 683
315 -int strstart(const char *str, const char *val, const char **ptr)  
316 -{  
317 - const char *p, *q;  
318 - p = str;  
319 - q = val;  
320 - while (*q != '\0') {  
321 - if (*p != *q)  
322 - return 0;  
323 - p++;  
324 - q++; 684 +
  685 + n_strtab = load_data(fd, (fhdr.f_symptr + fhdr.f_nsyms*SYMESZ), STRTAB_SIZE);
  686 + strtab = load_data(fd, (fhdr.f_symptr + fhdr.f_nsyms*SYMESZ), *n_strtab);
  687 +
  688 + nb_syms = fhdr.f_nsyms;
  689 +
  690 + for (i = 0, ext_sym = coff_symtab; i < nb_syms; i++, ext_sym++) {
  691 + if (strstart(ext_sym->e.e_name, ".text", NULL))
  692 + text_shndx = ext_sym->e_scnum;
  693 + if (strstart(ext_sym->e.e_name, ".data", NULL))
  694 + data_shndx = ext_sym->e_scnum;
325 } 695 }
326 - if (ptr)  
327 - *ptr = p;  
328 - return 1; 696 +
  697 + /* set coff symbol */
  698 + symtab = malloc(sizeof(struct coff_sym) * nb_syms);
  699 +
  700 + int aux_size, j;
  701 + for (i = 0, ext_sym = coff_symtab, sym = symtab; i < nb_syms; i++, ext_sym++, sym++) {
  702 + memset(sym, 0, sizeof(*sym));
  703 + sym->st_syment = ext_sym;
  704 + sym_ent_name(ext_sym, sym);
  705 + sym->st_value = ext_sym->e_value;
  706 +
  707 + aux_size = *(int8_t *)ext_sym->e_numaux;
  708 + if (ext_sym->e_scnum == text_shndx && ext_sym->e_type == T_FUNCTION) {
  709 + for (j = aux_size + 1; j < nb_syms - i; j++) {
  710 + if ((ext_sym + j)->e_scnum == text_shndx &&
  711 + (ext_sym + j)->e_type == T_FUNCTION ){
  712 + sym->st_size = (ext_sym + j)->e_value - ext_sym->e_value;
  713 + break;
  714 + } else if (j == nb_syms - i - 1) {
  715 + sec = &shdr[coff_text_shndx];
  716 + sym->st_size = sec->s_size - ext_sym->e_value;
  717 + break;
  718 + }
  719 + }
  720 + } else if (ext_sym->e_scnum == data_shndx && *(uint8_t *)ext_sym->e_sclass == C_EXTERNAL) {
  721 + for (j = aux_size + 1; j < nb_syms - i; j++) {
  722 + if ((ext_sym + j)->e_scnum == data_shndx) {
  723 + sym->st_size = (ext_sym + j)->e_value - ext_sym->e_value;
  724 + break;
  725 + } else if (j == nb_syms - i - 1) {
  726 + sec = &shdr[coff_data_shndx];
  727 + sym->st_size = sec->s_size - ext_sym->e_value;
  728 + break;
  729 + }
  730 + }
  731 + } else {
  732 + sym->st_size = 0;
  733 + }
  734 +
  735 + sym->st_type = ext_sym->e_type;
  736 + sym->st_shndx = ext_sym->e_scnum;
  737 + }
  738 +
  739 +
  740 + /* find text relocations, if any */
  741 + sec = &shdr[coff_text_shndx];
  742 + coff_relocs = load_data(fd, sec->s_relptr, sec->s_nreloc*RELSZ);
  743 + nb_relocs = sec->s_nreloc;
  744 +
  745 + /* set coff relocation */
  746 + relocs = malloc(sizeof(struct coff_rel) * nb_relocs);
  747 + for (i = 0, ext_rel = coff_relocs, rel = relocs; i < nb_relocs;
  748 + i++, ext_rel++, rel++) {
  749 + memset(rel, 0, sizeof(*rel));
  750 + rel->r_reloc = ext_rel;
  751 + rel->r_offset = *(uint32_t *)ext_rel->r_vaddr;
  752 + rel->r_type = *(uint16_t *)ext_rel->r_type;
  753 + }
  754 + return 0;
329 } 755 }
330 756
  757 +#endif /* CONFIG_FORMAT_COFF */
  758 +
331 #ifdef HOST_ARM 759 #ifdef HOST_ARM
332 760
333 int arm_emit_ldr_info(const char *name, unsigned long start_offset, 761 int arm_emit_ldr_info(const char *name, unsigned long start_offset,
@@ -385,7 +813,7 @@ int arm_emit_ldr_info(const char *name, unsigned long start_offset, @@ -385,7 +813,7 @@ int arm_emit_ldr_info(const char *name, unsigned long start_offset,
385 relname[0] = '\0'; 813 relname[0] = '\0';
386 for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { 814 for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
387 if (rel->r_offset == (pc_offset + start_offset)) { 815 if (rel->r_offset == (pc_offset + start_offset)) {
388 - sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name; 816 + sym_name = get_rel_sym_name(rel);
389 /* the compiler leave some unnecessary references to the code */ 817 /* the compiler leave some unnecessary references to the code */
390 if (strstart(sym_name, "__op_param", &p)) { 818 if (strstart(sym_name, "__op_param", &p)) {
391 snprintf(relname, sizeof(relname), "param%s", p); 819 snprintf(relname, sizeof(relname), "param%s", p);
@@ -432,8 +860,7 @@ int arm_emit_ldr_info(const char *name, unsigned long start_offset, @@ -432,8 +860,7 @@ int arm_emit_ldr_info(const char *name, unsigned long start_offset,
432 860
433 /* generate op code */ 861 /* generate op code */
434 void gen_code(const char *name, host_ulong offset, host_ulong size, 862 void gen_code(const char *name, host_ulong offset, host_ulong size,
435 - FILE *outfile, uint8_t *text, ELF_RELOC *relocs, int nb_relocs,  
436 - int gen_switch) 863 + FILE *outfile, int gen_switch)
437 { 864 {
438 int copy_size = 0; 865 int copy_size = 0;
439 uint8_t *p_start, *p_end; 866 uint8_t *p_start, *p_end;
@@ -441,7 +868,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, @@ -441,7 +868,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
441 int nb_args, i, n; 868 int nb_args, i, n;
442 uint8_t args_present[MAX_ARGS]; 869 uint8_t args_present[MAX_ARGS];
443 const char *sym_name, *p; 870 const char *sym_name, *p;
444 - ELF_RELOC *rel; 871 + EXE_RELOC *rel;
445 872
446 /* Compute exact size excluding prologue and epilogue instructions. 873 /* Compute exact size excluding prologue and epilogue instructions.
447 * Increment start_offset to skip epilogue instructions, then compute 874 * Increment start_offset to skip epilogue instructions, then compute
@@ -451,136 +878,141 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, @@ -451,136 +878,141 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
451 p_start = text + offset; 878 p_start = text + offset;
452 p_end = p_start + size; 879 p_end = p_start + size;
453 start_offset = offset; 880 start_offset = offset;
454 - switch(ELF_ARCH) {  
455 - case EM_386:  
456 - case EM_X86_64:  
457 - {  
458 - int len;  
459 - len = p_end - p_start;  
460 - if (len == 0)  
461 - error("empty code for %s", name);  
462 - if (p_end[-1] == 0xc3) {  
463 - len--;  
464 - } else { 881 +#if defined(HOST_I386) || defined(HOST_AMD64)
  882 +#ifdef CONFIG_FORMAT_COFF
  883 + {
  884 + uint8_t *p;
  885 + p = p_end - 1;
  886 + if (p == p_start)
  887 + error("empty code for %s", name);
  888 + while (*p != 0xc3) {
  889 + p--;
  890 + if (p <= p_start)
465 error("ret or jmp expected at the end of %s", name); 891 error("ret or jmp expected at the end of %s", name);
466 - }  
467 - copy_size = len;  
468 } 892 }
469 - break;  
470 - case EM_PPC:  
471 - {  
472 - uint8_t *p;  
473 - p = (void *)(p_end - 4);  
474 - if (p == p_start)  
475 - error("empty code for %s", name);  
476 - if (get32((uint32_t *)p) != 0x4e800020)  
477 - error("blr expected at the end of %s", name);  
478 - copy_size = p - p_start; 893 + copy_size = p - p_start;
  894 + }
  895 +#else
  896 + {
  897 + int len;
  898 + len = p_end - p_start;
  899 + if (len == 0)
  900 + error("empty code for %s", name);
  901 + if (p_end[-1] == 0xc3) {
  902 + len--;
  903 + } else {
  904 + error("ret or jmp expected at the end of %s", name);
479 } 905 }
480 - break;  
481 - case EM_S390:  
482 - {  
483 - uint8_t *p;  
484 - p = (void *)(p_end - 2);  
485 - if (p == p_start)  
486 - error("empty code for %s", name);  
487 - if (get16((uint16_t *)p) != 0x07fe && get16((uint16_t *)p) != 0x07f4)  
488 - error("br %%r14 expected at the end of %s", name);  
489 - copy_size = p - p_start;  
490 - }  
491 - break;  
492 - case EM_ALPHA:  
493 - {  
494 - uint8_t *p;  
495 - p = p_end - 4; 906 + copy_size = len;
  907 + }
  908 +#endif
  909 +#elif defined(HOST_PPC)
  910 + {
  911 + uint8_t *p;
  912 + p = (void *)(p_end - 4);
  913 + if (p == p_start)
  914 + error("empty code for %s", name);
  915 + if (get32((uint32_t *)p) != 0x4e800020)
  916 + error("blr expected at the end of %s", name);
  917 + copy_size = p - p_start;
  918 + }
  919 +#elif defined(HOST_S390)
  920 + {
  921 + uint8_t *p;
  922 + p = (void *)(p_end - 2);
  923 + if (p == p_start)
  924 + error("empty code for %s", name);
  925 + if (get16((uint16_t *)p) != 0x07fe && get16((uint16_t *)p) != 0x07f4)
  926 + error("br %%r14 expected at the end of %s", name);
  927 + copy_size = p - p_start;
  928 + }
  929 +#elif defined(HOST_ALPHA)
  930 + {
  931 + uint8_t *p;
  932 + p = p_end - 4;
496 #if 0 933 #if 0
497 - /* XXX: check why it occurs */  
498 - if (p == p_start)  
499 - error("empty code for %s", name); 934 + /* XXX: check why it occurs */
  935 + if (p == p_start)
  936 + error("empty code for %s", name);
500 #endif 937 #endif
501 - if (get32((uint32_t *)p) != 0x6bfa8001)  
502 - error("ret expected at the end of %s", name);  
503 - copy_size = p - p_start;  
504 - }  
505 - break;  
506 - case EM_IA_64:  
507 - {  
508 - uint8_t *p;  
509 - p = (void *)(p_end - 4);  
510 - if (p == p_start)  
511 - error("empty code for %s", name);  
512 - /* br.ret.sptk.many b0;; */  
513 - /* 08 00 84 00 */  
514 - if (get32((uint32_t *)p) != 0x00840008)  
515 - error("br.ret.sptk.many b0;; expected at the end of %s", name);  
516 - copy_size = p - p_start;  
517 - }  
518 - break;  
519 - case EM_SPARC:  
520 - case EM_SPARC32PLUS:  
521 - {  
522 - uint32_t start_insn, end_insn1, end_insn2;  
523 - uint8_t *p;  
524 - p = (void *)(p_end - 8);  
525 - if (p <= p_start)  
526 - error("empty code for %s", name);  
527 - start_insn = get32((uint32_t *)(p_start + 0x0));  
528 - end_insn1 = get32((uint32_t *)(p + 0x0));  
529 - end_insn2 = get32((uint32_t *)(p + 0x4));  
530 - if ((start_insn & ~0x1fff) == 0x9de3a000) {  
531 - p_start += 0x4;  
532 - start_offset += 0x4;  
533 - if ((int)(start_insn | ~0x1fff) < -128)  
534 - error("Found bogus save at the start of %s", name);  
535 - if (end_insn1 != 0x81c7e008 || end_insn2 != 0x81e80000)  
536 - error("ret; restore; not found at end of %s", name);  
537 - } else {  
538 - error("No save at the beginning of %s", name);  
539 - } 938 + if (get32((uint32_t *)p) != 0x6bfa8001)
  939 + error("ret expected at the end of %s", name);
  940 + copy_size = p - p_start;
  941 + }
  942 +#elif defined(HOST_IA64)
  943 + {
  944 + uint8_t *p;
  945 + p = (void *)(p_end - 4);
  946 + if (p == p_start)
  947 + error("empty code for %s", name);
  948 + /* br.ret.sptk.many b0;; */
  949 + /* 08 00 84 00 */
  950 + if (get32((uint32_t *)p) != 0x00840008)
  951 + error("br.ret.sptk.many b0;; expected at the end of %s", name);
  952 + copy_size = p - p_start;
  953 + }
  954 +#elif defined(HOST_SPARC)
  955 + {
  956 + uint32_t start_insn, end_insn1, end_insn2;
  957 + uint8_t *p;
  958 + p = (void *)(p_end - 8);
  959 + if (p <= p_start)
  960 + error("empty code for %s", name);
  961 + start_insn = get32((uint32_t *)(p_start + 0x0));
  962 + end_insn1 = get32((uint32_t *)(p + 0x0));
  963 + end_insn2 = get32((uint32_t *)(p + 0x4));
  964 + if ((start_insn & ~0x1fff) == 0x9de3a000) {
  965 + p_start += 0x4;
  966 + start_offset += 0x4;
  967 + if ((int)(start_insn | ~0x1fff) < -128)
  968 + error("Found bogus save at the start of %s", name);
  969 + if (end_insn1 != 0x81c7e008 || end_insn2 != 0x81e80000)
  970 + error("ret; restore; not found at end of %s", name);
  971 + } else {
  972 + error("No save at the beginning of %s", name);
  973 + }
540 #if 0 974 #if 0
541 - /* Skip a preceeding nop, if present. */  
542 - if (p > p_start) {  
543 - skip_insn = get32((uint32_t *)(p - 0x4));  
544 - if (skip_insn == 0x01000000)  
545 - p -= 4;  
546 - } 975 + /* Skip a preceeding nop, if present. */
  976 + if (p > p_start) {
  977 + skip_insn = get32((uint32_t *)(p - 0x4));
  978 + if (skip_insn == 0x01000000)
  979 + p -= 4;
  980 + }
547 #endif 981 #endif
548 - copy_size = p - p_start;  
549 - }  
550 - break;  
551 - case EM_SPARCV9:  
552 - {  
553 - uint32_t start_insn, end_insn1, end_insn2, skip_insn;  
554 - uint8_t *p;  
555 - p = (void *)(p_end - 8);  
556 - if (p <= p_start)  
557 - error("empty code for %s", name);  
558 - start_insn = get32((uint32_t *)(p_start + 0x0));  
559 - end_insn1 = get32((uint32_t *)(p + 0x0));  
560 - end_insn2 = get32((uint32_t *)(p + 0x4));  
561 - if ((start_insn & ~0x1fff) == 0x9de3a000) {  
562 - p_start += 0x4;  
563 - start_offset += 0x4;  
564 - if ((int)(start_insn | ~0x1fff) < -256)  
565 - error("Found bogus save at the start of %s", name);  
566 - if (end_insn1 != 0x81c7e008 || end_insn2 != 0x81e80000)  
567 - error("ret; restore; not found at end of %s", name);  
568 - } else {  
569 - error("No save at the beginning of %s", name);  
570 - }  
571 -  
572 - /* Skip a preceeding nop, if present. */  
573 - if (p > p_start) {  
574 - skip_insn = get32((uint32_t *)(p - 0x4));  
575 - if (skip_insn == 0x01000000)  
576 - p -= 4;  
577 - }  
578 -  
579 - copy_size = p - p_start;  
580 - }  
581 - break;  
582 -#ifdef HOST_ARM  
583 - case EM_ARM: 982 + copy_size = p - p_start;
  983 + }
  984 +#elif defined(HOST_SPARC64)
  985 + {
  986 + uint32_t start_insn, end_insn1, end_insn2, skip_insn;
  987 + uint8_t *p;
  988 + p = (void *)(p_end - 8);
  989 + if (p <= p_start)
  990 + error("empty code for %s", name);
  991 + start_insn = get32((uint32_t *)(p_start + 0x0));
  992 + end_insn1 = get32((uint32_t *)(p + 0x0));
  993 + end_insn2 = get32((uint32_t *)(p + 0x4));
  994 + if ((start_insn & ~0x1fff) == 0x9de3a000) {
  995 + p_start += 0x4;
  996 + start_offset += 0x4;
  997 + if ((int)(start_insn | ~0x1fff) < -256)
  998 + error("Found bogus save at the start of %s", name);
  999 + if (end_insn1 != 0x81c7e008 || end_insn2 != 0x81e80000)
  1000 + error("ret; restore; not found at end of %s", name);
  1001 + } else {
  1002 + error("No save at the beginning of %s", name);
  1003 + }
  1004 +
  1005 + /* Skip a preceeding nop, if present. */
  1006 + if (p > p_start) {
  1007 + skip_insn = get32((uint32_t *)(p - 0x4));
  1008 + if (skip_insn == 0x01000000)
  1009 + p -= 4;
  1010 + }
  1011 +
  1012 + copy_size = p - p_start;
  1013 + }
  1014 +#elif defined(HOST_ARM)
  1015 + {
584 if ((p_end - p_start) <= 16) 1016 if ((p_end - p_start) <= 16)
585 error("%s: function too small", name); 1017 error("%s: function too small", name);
586 if (get32((uint32_t *)p_start) != 0xe1a0c00d || 1018 if (get32((uint32_t *)p_start) != 0xe1a0c00d ||
@@ -591,26 +1023,24 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, @@ -591,26 +1023,24 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
591 start_offset += 12; 1023 start_offset += 12;
592 copy_size = arm_emit_ldr_info(name, start_offset, NULL, p_start, p_end, 1024 copy_size = arm_emit_ldr_info(name, start_offset, NULL, p_start, p_end,
593 relocs, nb_relocs); 1025 relocs, nb_relocs);
594 - break;  
595 -#endif  
596 - case EM_68K:  
597 - {  
598 - uint8_t *p;  
599 - p = (void *)(p_end - 2);  
600 - if (p == p_start)  
601 - error("empty code for %s", name);  
602 - // remove NOP's, probably added for alignment  
603 - while ((get16((uint16_t *)p) == 0x4e71) &&  
604 - (p>p_start))  
605 - p -= 2;  
606 - if (get16((uint16_t *)p) != 0x4e75)  
607 - error("rts expected at the end of %s", name);  
608 - copy_size = p - p_start;  
609 - }  
610 - break;  
611 - default:  
612 - error("unknown ELF architecture");  
613 } 1026 }
  1027 +#elif defined(HOST_M68K)
  1028 + {
  1029 + uint8_t *p;
  1030 + p = (void *)(p_end - 2);
  1031 + if (p == p_start)
  1032 + error("empty code for %s", name);
  1033 + // remove NOP's, probably added for alignment
  1034 + while ((get16((uint16_t *)p) == 0x4e71) &&
  1035 + (p>p_start))
  1036 + p -= 2;
  1037 + if (get16((uint16_t *)p) != 0x4e75)
  1038 + error("rts expected at the end of %s", name);
  1039 + copy_size = p - p_start;
  1040 + }
  1041 +#else
  1042 +#error unsupported CPU
  1043 +#endif
614 1044
615 /* compute the number of arguments by looking at the relocations */ 1045 /* compute the number of arguments by looking at the relocations */
616 for(i = 0;i < MAX_ARGS; i++) 1046 for(i = 0;i < MAX_ARGS; i++)
@@ -619,7 +1049,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, @@ -619,7 +1049,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
619 for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { 1049 for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
620 if (rel->r_offset >= start_offset && 1050 if (rel->r_offset >= start_offset &&
621 rel->r_offset < start_offset + (p_end - p_start)) { 1051 rel->r_offset < start_offset + (p_end - p_start)) {
622 - sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name; 1052 + sym_name = get_rel_sym_name(rel);
623 if (strstart(sym_name, "__op_param", &p)) { 1053 if (strstart(sym_name, "__op_param", &p)) {
624 n = strtoul(p, NULL, 10); 1054 n = strtoul(p, NULL, 10);
625 if (n > MAX_ARGS) 1055 if (n > MAX_ARGS)
@@ -657,7 +1087,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, @@ -657,7 +1087,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
657 for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { 1087 for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
658 if (rel->r_offset >= start_offset && 1088 if (rel->r_offset >= start_offset &&
659 rel->r_offset < start_offset + (p_end - p_start)) { 1089 rel->r_offset < start_offset + (p_end - p_start)) {
660 - sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name; 1090 + sym_name = get_rel_sym_name(rel);
661 if (*sym_name && 1091 if (*sym_name &&
662 !strstart(sym_name, "__op_param", NULL) && 1092 !strstart(sym_name, "__op_param", NULL) &&
663 !strstart(sym_name, "__op_jmp", NULL)) { 1093 !strstart(sym_name, "__op_jmp", NULL)) {
@@ -678,20 +1108,30 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, @@ -678,20 +1108,30 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
678 1108
679 /* emit code offset information */ 1109 /* emit code offset information */
680 { 1110 {
681 - ElfW(Sym) *sym; 1111 + EXE_SYM *sym;
682 const char *sym_name, *p; 1112 const char *sym_name, *p;
683 unsigned long val; 1113 unsigned long val;
684 int n; 1114 int n;
685 1115
686 for(i = 0, sym = symtab; i < nb_syms; i++, sym++) { 1116 for(i = 0, sym = symtab; i < nb_syms; i++, sym++) {
687 - sym_name = strtab + sym->st_name; 1117 + sym_name = get_sym_name(sym);
688 if (strstart(sym_name, "__op_label", &p)) { 1118 if (strstart(sym_name, "__op_label", &p)) {
689 uint8_t *ptr; 1119 uint8_t *ptr;
690 unsigned long offset; 1120 unsigned long offset;
691 1121
692 /* test if the variable refers to a label inside 1122 /* test if the variable refers to a label inside
693 the code we are generating */ 1123 the code we are generating */
  1124 +#ifdef CONFIG_FORMAT_COFF
  1125 + if (sym->st_shndx == text_shndx) {
  1126 + ptr = sdata[coff_text_shndx];
  1127 + } else if (sym->st_shndx == data_shndx) {
  1128 + ptr = sdata[coff_data_shndx];
  1129 + } else {
  1130 + ptr = NULL;
  1131 + }
  1132 +#else
694 ptr = sdata[sym->st_shndx]; 1133 ptr = sdata[sym->st_shndx];
  1134 +#endif
695 if (!ptr) 1135 if (!ptr)
696 error("__op_labelN in invalid section"); 1136 error("__op_labelN in invalid section");
697 offset = sym->st_value; 1137 offset = sym->st_value;
@@ -739,7 +1179,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, @@ -739,7 +1179,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
739 for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { 1179 for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
740 if (rel->r_offset >= start_offset && 1180 if (rel->r_offset >= start_offset &&
741 rel->r_offset < start_offset + copy_size) { 1181 rel->r_offset < start_offset + copy_size) {
742 - sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name; 1182 + sym_name = get_rel_sym_name(rel);
743 if (strstart(sym_name, "__op_jmp", &p)) { 1183 if (strstart(sym_name, "__op_jmp", &p)) {
744 int n; 1184 int n;
745 n = strtol(p, NULL, 10); 1185 n = strtol(p, NULL, 10);
@@ -757,8 +1197,9 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, @@ -757,8 +1197,9 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
757 } else { 1197 } else {
758 snprintf(name, sizeof(name), "(long)(&%s)", sym_name); 1198 snprintf(name, sizeof(name), "(long)(&%s)", sym_name);
759 } 1199 }
760 - type = ELF32_R_TYPE(rel->r_info);  
761 addend = get32((uint32_t *)(text + rel->r_offset)); 1200 addend = get32((uint32_t *)(text + rel->r_offset));
  1201 +#ifdef CONFIG_FORMAT_ELF
  1202 + type = ELF32_R_TYPE(rel->r_info);
762 switch(type) { 1203 switch(type) {
763 case R_386_32: 1204 case R_386_32:
764 fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", 1205 fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n",
@@ -771,6 +1212,23 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, @@ -771,6 +1212,23 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
771 default: 1212 default:
772 error("unsupported i386 relocation (%d)", type); 1213 error("unsupported i386 relocation (%d)", type);
773 } 1214 }
  1215 +#elif defined(CONFIG_FORMAT_COFF)
  1216 + type = rel->r_type;
  1217 + switch(type) {
  1218 + case DIR32:
  1219 + fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n",
  1220 + rel->r_offset - start_offset, name, addend);
  1221 + break;
  1222 + case DISP32:
  1223 + fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s - (long)(gen_code_ptr + %d) + %d -4;\n",
  1224 + rel->r_offset - start_offset, name, rel->r_offset - start_offset, addend);
  1225 + break;
  1226 + default:
  1227 + error("unsupported i386 relocation (%d)", type);
  1228 + }
  1229 +#else
  1230 +#error unsupport object format
  1231 +#endif
774 } 1232 }
775 } 1233 }
776 } 1234 }
@@ -1204,114 +1662,10 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, @@ -1204,114 +1662,10 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
1204 } 1662 }
1205 } 1663 }
1206 1664
1207 -/* load an elf object file */  
1208 -int load_elf(const char *filename, FILE *outfile, int out_type) 1665 +int gen_file(FILE *outfile, int out_type)
1209 { 1666 {
1210 - int fd;  
1211 - struct elf_shdr *sec, *symtab_sec, *strtab_sec, *text_sec;  
1212 - int i, j;  
1213 - ElfW(Sym) *sym;  
1214 - char *shstr;  
1215 - uint8_t *text;  
1216 - ELF_RELOC *relocs;  
1217 - int nb_relocs;  
1218 - ELF_RELOC *rel;  
1219 -  
1220 - fd = open(filename, O_RDONLY);  
1221 - if (fd < 0)  
1222 - error("can't open file '%s'", filename);  
1223 -  
1224 - /* Read ELF header. */  
1225 - if (read(fd, &ehdr, sizeof (ehdr)) != sizeof (ehdr))  
1226 - error("unable to read file header");  
1227 -  
1228 - /* Check ELF identification. */  
1229 - if (ehdr.e_ident[EI_MAG0] != ELFMAG0  
1230 - || ehdr.e_ident[EI_MAG1] != ELFMAG1  
1231 - || ehdr.e_ident[EI_MAG2] != ELFMAG2  
1232 - || ehdr.e_ident[EI_MAG3] != ELFMAG3  
1233 - || ehdr.e_ident[EI_VERSION] != EV_CURRENT) {  
1234 - error("bad ELF header");  
1235 - }  
1236 -  
1237 - do_swap = elf_must_swap(&ehdr);  
1238 - if (do_swap)  
1239 - elf_swap_ehdr(&ehdr);  
1240 - if (ehdr.e_ident[EI_CLASS] != ELF_CLASS)  
1241 - error("Unsupported ELF class");  
1242 - if (ehdr.e_type != ET_REL)  
1243 - error("ELF object file expected");  
1244 - if (ehdr.e_version != EV_CURRENT)  
1245 - error("Invalid ELF version");  
1246 - if (!elf_check_arch(ehdr.e_machine))  
1247 - error("Unsupported CPU (e_machine=%d)", ehdr.e_machine);  
1248 -  
1249 - /* read section headers */  
1250 - shdr = load_data(fd, ehdr.e_shoff, ehdr.e_shnum * sizeof(struct elf_shdr));  
1251 - if (do_swap) {  
1252 - for(i = 0; i < ehdr.e_shnum; i++) {  
1253 - elf_swap_shdr(&shdr[i]);  
1254 - }  
1255 - }  
1256 -  
1257 - /* read all section data */  
1258 - sdata = malloc(sizeof(void *) * ehdr.e_shnum);  
1259 - memset(sdata, 0, sizeof(void *) * ehdr.e_shnum);  
1260 -  
1261 - for(i = 0;i < ehdr.e_shnum; i++) {  
1262 - sec = &shdr[i];  
1263 - if (sec->sh_type != SHT_NOBITS)  
1264 - sdata[i] = load_data(fd, sec->sh_offset, sec->sh_size);  
1265 - }  
1266 -  
1267 - sec = &shdr[ehdr.e_shstrndx];  
1268 - shstr = sdata[ehdr.e_shstrndx];  
1269 -  
1270 - /* swap relocations */  
1271 - for(i = 0; i < ehdr.e_shnum; i++) {  
1272 - sec = &shdr[i];  
1273 - if (sec->sh_type == SHT_RELOC) {  
1274 - nb_relocs = sec->sh_size / sec->sh_entsize;  
1275 - if (do_swap) {  
1276 - for(j = 0, rel = (ELF_RELOC *)sdata[i]; j < nb_relocs; j++, rel++)  
1277 - elf_swap_rel(rel);  
1278 - }  
1279 - }  
1280 - }  
1281 - /* text section */  
1282 -  
1283 - text_sec = find_elf_section(shdr, ehdr.e_shnum, shstr, ".text");  
1284 - if (!text_sec)  
1285 - error("could not find .text section");  
1286 - text_shndx = text_sec - shdr;  
1287 - text = sdata[text_shndx];  
1288 -  
1289 - /* find text relocations, if any */  
1290 - relocs = NULL;  
1291 - nb_relocs = 0;  
1292 - i = find_reloc(text_shndx);  
1293 - if (i != 0) {  
1294 - relocs = (ELF_RELOC *)sdata[i];  
1295 - nb_relocs = shdr[i].sh_size / shdr[i].sh_entsize;  
1296 - }  
1297 -  
1298 - symtab_sec = find_elf_section(shdr, ehdr.e_shnum, shstr, ".symtab");  
1299 - if (!symtab_sec)  
1300 - error("could not find .symtab section");  
1301 - strtab_sec = &shdr[symtab_sec->sh_link];  
1302 -  
1303 - symtab = (ElfW(Sym) *)sdata[symtab_sec - shdr];  
1304 - strtab = sdata[symtab_sec->sh_link];  
1305 -  
1306 - nb_syms = symtab_sec->sh_size / sizeof(ElfW(Sym));  
1307 - if (do_swap) {  
1308 - for(i = 0, sym = symtab; i < nb_syms; i++, sym++) {  
1309 - swab32s(&sym->st_name);  
1310 - swabls(&sym->st_value);  
1311 - swabls(&sym->st_size);  
1312 - swab16s(&sym->st_shndx);  
1313 - }  
1314 - } 1667 + int i;
  1668 + EXE_SYM *sym;
1315 1669
1316 if (out_type == OUT_INDEX_OP) { 1670 if (out_type == OUT_INDEX_OP) {
1317 fprintf(outfile, "DEF(end, 0, 0)\n"); 1671 fprintf(outfile, "DEF(end, 0, 0)\n");
@@ -1321,10 +1675,9 @@ int load_elf(const char *filename, FILE *outfile, int out_type) @@ -1321,10 +1675,9 @@ int load_elf(const char *filename, FILE *outfile, int out_type)
1321 fprintf(outfile, "DEF(nop3, 3, 0)\n"); 1675 fprintf(outfile, "DEF(nop3, 3, 0)\n");
1322 for(i = 0, sym = symtab; i < nb_syms; i++, sym++) { 1676 for(i = 0, sym = symtab; i < nb_syms; i++, sym++) {
1323 const char *name, *p; 1677 const char *name, *p;
1324 - name = strtab + sym->st_name; 1678 + name = get_sym_name(sym);
1325 if (strstart(name, OP_PREFIX, &p)) { 1679 if (strstart(name, OP_PREFIX, &p)) {
1326 - gen_code(name, sym->st_value, sym->st_size, outfile,  
1327 - text, relocs, nb_relocs, 2); 1680 + gen_code(name, sym->st_value, sym->st_size, outfile, 2);
1328 } 1681 }
1329 } 1682 }
1330 } else if (out_type == OUT_GEN_OP) { 1683 } else if (out_type == OUT_GEN_OP) {
@@ -1332,12 +1685,11 @@ int load_elf(const char *filename, FILE *outfile, int out_type) @@ -1332,12 +1685,11 @@ int load_elf(const char *filename, FILE *outfile, int out_type)
1332 1685
1333 for(i = 0, sym = symtab; i < nb_syms; i++, sym++) { 1686 for(i = 0, sym = symtab; i < nb_syms; i++, sym++) {
1334 const char *name; 1687 const char *name;
1335 - name = strtab + sym->st_name; 1688 + name = get_sym_name(sym);
1336 if (strstart(name, OP_PREFIX, NULL)) { 1689 if (strstart(name, OP_PREFIX, NULL)) {
1337 - if (sym->st_shndx != (text_sec - shdr)) 1690 + if (sym->st_shndx != text_shndx)
1338 error("invalid section for opcode (0x%x)", sym->st_shndx); 1691 error("invalid section for opcode (0x%x)", sym->st_shndx);
1339 - gen_code(name, sym->st_value, sym->st_size, outfile,  
1340 - text, relocs, nb_relocs, 0); 1692 + gen_code(name, sym->st_value, sym->st_size, outfile, 0);
1341 } 1693 }
1342 } 1694 }
1343 1695
@@ -1374,16 +1726,15 @@ fprintf(outfile, @@ -1374,16 +1726,15 @@ fprintf(outfile,
1374 1726
1375 for(i = 0, sym = symtab; i < nb_syms; i++, sym++) { 1727 for(i = 0, sym = symtab; i < nb_syms; i++, sym++) {
1376 const char *name; 1728 const char *name;
1377 - name = strtab + sym->st_name; 1729 + name = get_sym_name(sym);
1378 if (strstart(name, OP_PREFIX, NULL)) { 1730 if (strstart(name, OP_PREFIX, NULL)) {
1379 #if 0 1731 #if 0
1380 printf("%4d: %s pos=0x%08x len=%d\n", 1732 printf("%4d: %s pos=0x%08x len=%d\n",
1381 i, name, sym->st_value, sym->st_size); 1733 i, name, sym->st_value, sym->st_size);
1382 #endif 1734 #endif
1383 - if (sym->st_shndx != (text_sec - shdr)) 1735 + if (sym->st_shndx != text_shndx)
1384 error("invalid section for opcode (0x%x)", sym->st_shndx); 1736 error("invalid section for opcode (0x%x)", sym->st_shndx);
1385 - gen_code(name, sym->st_value, sym->st_size, outfile,  
1386 - text, relocs, nb_relocs, 1); 1737 + gen_code(name, sym->st_value, sym->st_size, outfile, 1);
1387 } 1738 }
1388 } 1739 }
1389 1740
@@ -1432,7 +1783,6 @@ fprintf(outfile, &quot;gen_code_ptr = arm_flush_ldr(gen_code_ptr, arm_ldr_table, arm_ @@ -1432,7 +1783,6 @@ fprintf(outfile, &quot;gen_code_ptr = arm_flush_ldr(gen_code_ptr, arm_ldr_table, arm_
1432 1783
1433 } 1784 }
1434 1785
1435 - close(fd);  
1436 return 0; 1786 return 0;
1437 } 1787 }
1438 1788
@@ -1480,7 +1830,9 @@ int main(int argc, char **argv) @@ -1480,7 +1830,9 @@ int main(int argc, char **argv)
1480 outfile = fopen(outfilename, "w"); 1830 outfile = fopen(outfilename, "w");
1481 if (!outfile) 1831 if (!outfile)
1482 error("could not open '%s'", outfilename); 1832 error("could not open '%s'", outfilename);
1483 - load_elf(filename, outfile, out_type); 1833 +
  1834 + load_object(filename);
  1835 + gen_file(outfile, out_type);
1484 fclose(outfile); 1836 fclose(outfile);
1485 return 0; 1837 return 0;
1486 } 1838 }
exec-all.h
@@ -141,7 +141,7 @@ int tlb_set_page(CPUState *env, uint32_t vaddr, uint32_t paddr, int prot, @@ -141,7 +141,7 @@ int tlb_set_page(CPUState *env, uint32_t vaddr, uint32_t paddr, int prot,
141 #if defined(__powerpc__) 141 #if defined(__powerpc__)
142 #define USE_DIRECT_JUMP 142 #define USE_DIRECT_JUMP
143 #endif 143 #endif
144 -#if defined(__i386__) 144 +#if defined(__i386__) && !defined(_WIN32)
145 #define USE_DIRECT_JUMP 145 #define USE_DIRECT_JUMP
146 #endif 146 #endif
147 147
@@ -322,13 +322,19 @@ do {\ @@ -322,13 +322,19 @@ do {\
322 322
323 #elif defined(__i386__) && defined(USE_DIRECT_JUMP) 323 #elif defined(__i386__) && defined(USE_DIRECT_JUMP)
324 324
  325 +#ifdef _WIN32
  326 +#define ASM_PREVIOUS_SECTION ".section .text\n"
  327 +#else
  328 +#define ASM_PREVIOUS_SECTION ".previous\n"
  329 +#endif
  330 +
325 /* we patch the jump instruction directly */ 331 /* we patch the jump instruction directly */
326 #define JUMP_TB(opname, tbparam, n, eip)\ 332 #define JUMP_TB(opname, tbparam, n, eip)\
327 do {\ 333 do {\
328 - asm volatile (".section \".data\"\n"\ 334 + asm volatile (".section .data\n"\
329 "__op_label" #n "." stringify(opname) ":\n"\ 335 "__op_label" #n "." stringify(opname) ":\n"\
330 ".long 1f\n"\ 336 ".long 1f\n"\
331 - ".previous\n"\ 337 + ASM_PREVIOUS_SECTION \
332 "jmp __op_jmp" #n "\n"\ 338 "jmp __op_jmp" #n "\n"\
333 "1:\n");\ 339 "1:\n");\
334 T0 = (long)(tbparam) + (n);\ 340 T0 = (long)(tbparam) + (n);\
@@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
17 * License along with this library; if not, write to the Free Software 17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */ 19 */
  20 +#include "config.h"
20 #include <stdlib.h> 21 #include <stdlib.h>
21 #include <stdio.h> 22 #include <stdio.h>
22 #include <stdarg.h> 23 #include <stdarg.h>
@@ -24,9 +25,10 @@ @@ -24,9 +25,10 @@
24 #include <errno.h> 25 #include <errno.h>
25 #include <unistd.h> 26 #include <unistd.h>
26 #include <inttypes.h> 27 #include <inttypes.h>
  28 +#if !defined(CONFIG_SOFTMMU)
27 #include <sys/mman.h> 29 #include <sys/mman.h>
  30 +#endif
28 31
29 -#include "config.h"  
30 #include "cpu.h" 32 #include "cpu.h"
31 #include "exec-all.h" 33 #include "exec-all.h"
32 34
@@ -121,7 +123,11 @@ static void page_init(void) @@ -121,7 +123,11 @@ static void page_init(void)
121 { 123 {
122 /* NOTE: we can always suppose that host_page_size >= 124 /* NOTE: we can always suppose that host_page_size >=
123 TARGET_PAGE_SIZE */ 125 TARGET_PAGE_SIZE */
  126 +#ifdef _WIN32
  127 + real_host_page_size = 4096;
  128 +#else
124 real_host_page_size = getpagesize(); 129 real_host_page_size = getpagesize();
  130 +#endif
125 if (host_page_size == 0) 131 if (host_page_size == 0)
126 host_page_size = real_host_page_size; 132 host_page_size = real_host_page_size;
127 if (host_page_size < TARGET_PAGE_SIZE) 133 if (host_page_size < TARGET_PAGE_SIZE)
@@ -1369,14 +1375,14 @@ int tlb_set_page(CPUState *env, uint32_t vaddr, uint32_t paddr, int prot, @@ -1369,14 +1375,14 @@ int tlb_set_page(CPUState *env, uint32_t vaddr, uint32_t paddr, int prot,
1369 1375
1370 index = (vaddr >> 12) & (CPU_TLB_SIZE - 1); 1376 index = (vaddr >> 12) & (CPU_TLB_SIZE - 1);
1371 addend -= vaddr; 1377 addend -= vaddr;
1372 - if (prot & PROT_READ) { 1378 + if (prot & PAGE_READ) {
1373 env->tlb_read[is_user][index].address = address; 1379 env->tlb_read[is_user][index].address = address;
1374 env->tlb_read[is_user][index].addend = addend; 1380 env->tlb_read[is_user][index].addend = addend;
1375 } else { 1381 } else {
1376 env->tlb_read[is_user][index].address = -1; 1382 env->tlb_read[is_user][index].address = -1;
1377 env->tlb_read[is_user][index].addend = -1; 1383 env->tlb_read[is_user][index].addend = -1;
1378 } 1384 }
1379 - if (prot & PROT_WRITE) { 1385 + if (prot & PAGE_WRITE) {
1380 if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_ROM) { 1386 if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_ROM) {
1381 /* ROM: access is ignored (same as unassigned) */ 1387 /* ROM: access is ignored (same as unassigned) */
1382 env->tlb_write[is_user][index].address = vaddr | IO_MEM_ROM; 1388 env->tlb_write[is_user][index].address = vaddr | IO_MEM_ROM;
gdbstub.c
@@ -17,18 +17,12 @@ @@ -17,18 +17,12 @@
17 * License along with this library; if not, write to the Free Software 17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */ 19 */
20 -#include <stdlib.h>  
21 -#include <stdio.h>  
22 -#include <string.h>  
23 -#include <unistd.h>  
24 -#include <errno.h> 20 +#include "vl.h"
  21 +
25 #include <sys/socket.h> 22 #include <sys/socket.h>
26 #include <netinet/in.h> 23 #include <netinet/in.h>
27 #include <netinet/tcp.h> 24 #include <netinet/tcp.h>
28 #include <signal.h> 25 #include <signal.h>
29 -#include <fcntl.h>  
30 -  
31 -#include "vl.h"  
32 26
33 //#define DEBUG_GDB 27 //#define DEBUG_GDB
34 28
hw/dma.c
@@ -21,11 +21,6 @@ @@ -21,11 +21,6 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdio.h>  
25 -#include <stdlib.h>  
26 -#include <inttypes.h>  
27 -  
28 -#include "cpu.h"  
29 #include "vl.h" 24 #include "vl.h"
30 25
31 #define log(...) fprintf (stderr, "dma: " __VA_ARGS__) 26 #define log(...) fprintf (stderr, "dma: " __VA_ARGS__)
hw/fdc.c
@@ -21,11 +21,6 @@ @@ -21,11 +21,6 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdio.h>  
25 -#include <stdlib.h>  
26 -#include <string.h>  
27 -#include <inttypes.h>  
28 -  
29 #include "vl.h" 24 #include "vl.h"
30 25
31 /********************************************************/ 26 /********************************************************/
hw/i8254.c
@@ -21,26 +21,6 @@ @@ -21,26 +21,6 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdlib.h>  
25 -#include <stdio.h>  
26 -#include <stdarg.h>  
27 -#include <string.h>  
28 -#include <getopt.h>  
29 -#include <inttypes.h>  
30 -#include <unistd.h>  
31 -#include <sys/mman.h>  
32 -#include <fcntl.h>  
33 -#include <signal.h>  
34 -#include <time.h>  
35 -#include <sys/time.h>  
36 -#include <malloc.h>  
37 -#include <termios.h>  
38 -#include <sys/poll.h>  
39 -#include <errno.h>  
40 -#include <sys/wait.h>  
41 -#include <netinet/in.h>  
42 -  
43 -#include "cpu.h"  
44 #include "vl.h" 24 #include "vl.h"
45 25
46 //#define DEBUG_PIT 26 //#define DEBUG_PIT
hw/i8259.c
@@ -21,26 +21,6 @@ @@ -21,26 +21,6 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdlib.h>  
25 -#include <stdio.h>  
26 -#include <stdarg.h>  
27 -#include <string.h>  
28 -#include <getopt.h>  
29 -#include <inttypes.h>  
30 -#include <unistd.h>  
31 -#include <sys/mman.h>  
32 -#include <fcntl.h>  
33 -#include <signal.h>  
34 -#include <time.h>  
35 -#include <sys/time.h>  
36 -#include <malloc.h>  
37 -#include <termios.h>  
38 -#include <sys/poll.h>  
39 -#include <errno.h>  
40 -#include <sys/wait.h>  
41 -#include <netinet/in.h>  
42 -  
43 -#include "cpu.h"  
44 #include "vl.h" 24 #include "vl.h"
45 25
46 /* debug PIC */ 26 /* debug PIC */
hw/ide.c
@@ -21,31 +21,6 @@ @@ -21,31 +21,6 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdlib.h>  
25 -#include <stdio.h>  
26 -#include <stdarg.h>  
27 -#include <string.h>  
28 -#include <getopt.h>  
29 -#include <inttypes.h>  
30 -#include <unistd.h>  
31 -#include <sys/mman.h>  
32 -#include <fcntl.h>  
33 -#include <signal.h>  
34 -#include <time.h>  
35 -#include <sys/time.h>  
36 -#include <malloc.h>  
37 -#include <termios.h>  
38 -#include <sys/poll.h>  
39 -#include <errno.h>  
40 -#include <sys/wait.h>  
41 -#include <netinet/in.h>  
42 -  
43 -#define NO_THUNK_TYPE_SIZE  
44 -#include "thunk.h"  
45 -  
46 -#include "cpu.h"  
47 -#include "exec-all.h"  
48 -  
49 #include "vl.h" 24 #include "vl.h"
50 25
51 /* debug IDE devices */ 26 /* debug IDE devices */
@@ -375,6 +350,15 @@ static void padstr8(uint8_t *buf, int buf_size, const char *src) @@ -375,6 +350,15 @@ static void padstr8(uint8_t *buf, int buf_size, const char *src)
375 } 350 }
376 } 351 }
377 352
  353 +static void put_le16(uint16_t *p, unsigned int v)
  354 +{
  355 +#ifdef WORDS_BIGENDIAN
  356 + *p = bswap16(v);
  357 +#else
  358 + *p = v;
  359 +#endif
  360 +}
  361 +
378 static void ide_identify(IDEState *s) 362 static void ide_identify(IDEState *s)
379 { 363 {
380 uint16_t *p; 364 uint16_t *p;
@@ -382,43 +366,43 @@ static void ide_identify(IDEState *s) @@ -382,43 +366,43 @@ static void ide_identify(IDEState *s)
382 366
383 memset(s->io_buffer, 0, 512); 367 memset(s->io_buffer, 0, 512);
384 p = (uint16_t *)s->io_buffer; 368 p = (uint16_t *)s->io_buffer;
385 - stw_raw(p + 0, 0x0040);  
386 - stw_raw(p + 1, s->cylinders);  
387 - stw_raw(p + 3, s->heads);  
388 - stw_raw(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */  
389 - stw_raw(p + 5, 512); /* XXX: retired, remove ? */  
390 - stw_raw(p + 6, s->sectors); 369 + put_le16(p + 0, 0x0040);
  370 + put_le16(p + 1, s->cylinders);
  371 + put_le16(p + 3, s->heads);
  372 + put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
  373 + put_le16(p + 5, 512); /* XXX: retired, remove ? */
  374 + put_le16(p + 6, s->sectors);
391 padstr((uint8_t *)(p + 10), "QM00001", 20); /* serial number */ 375 padstr((uint8_t *)(p + 10), "QM00001", 20); /* serial number */
392 - stw_raw(p + 20, 3); /* XXX: retired, remove ? */  
393 - stw_raw(p + 21, 512); /* cache size in sectors */  
394 - stw_raw(p + 22, 4); /* ecc bytes */ 376 + put_le16(p + 20, 3); /* XXX: retired, remove ? */
  377 + put_le16(p + 21, 512); /* cache size in sectors */
  378 + put_le16(p + 22, 4); /* ecc bytes */
395 padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */ 379 padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */
396 padstr((uint8_t *)(p + 27), "QEMU HARDDISK", 40); /* model */ 380 padstr((uint8_t *)(p + 27), "QEMU HARDDISK", 40); /* model */
397 #if MAX_MULT_SECTORS > 1 381 #if MAX_MULT_SECTORS > 1
398 - stw_raw(p + 47, 0x8000 | MAX_MULT_SECTORS); 382 + put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
399 #endif 383 #endif
400 - stw_raw(p + 48, 1); /* dword I/O */  
401 - stw_raw(p + 49, 1 << 9); /* LBA supported, no DMA */  
402 - stw_raw(p + 51, 0x200); /* PIO transfer cycle */  
403 - stw_raw(p + 52, 0x200); /* DMA transfer cycle */  
404 - stw_raw(p + 53, 1); /* words 54-58 are valid */  
405 - stw_raw(p + 54, s->cylinders);  
406 - stw_raw(p + 55, s->heads);  
407 - stw_raw(p + 56, s->sectors); 384 + put_le16(p + 48, 1); /* dword I/O */
  385 + put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
  386 + put_le16(p + 51, 0x200); /* PIO transfer cycle */
  387 + put_le16(p + 52, 0x200); /* DMA transfer cycle */
  388 + put_le16(p + 53, 1); /* words 54-58 are valid */
  389 + put_le16(p + 54, s->cylinders);
  390 + put_le16(p + 55, s->heads);
  391 + put_le16(p + 56, s->sectors);
408 oldsize = s->cylinders * s->heads * s->sectors; 392 oldsize = s->cylinders * s->heads * s->sectors;
409 - stw_raw(p + 57, oldsize);  
410 - stw_raw(p + 58, oldsize >> 16); 393 + put_le16(p + 57, oldsize);
  394 + put_le16(p + 58, oldsize >> 16);
411 if (s->mult_sectors) 395 if (s->mult_sectors)
412 - stw_raw(p + 59, 0x100 | s->mult_sectors);  
413 - stw_raw(p + 60, s->nb_sectors);  
414 - stw_raw(p + 61, s->nb_sectors >> 16);  
415 - stw_raw(p + 80, (1 << 1) | (1 << 2));  
416 - stw_raw(p + 82, (1 << 14));  
417 - stw_raw(p + 83, (1 << 14));  
418 - stw_raw(p + 84, (1 << 14));  
419 - stw_raw(p + 85, (1 << 14));  
420 - stw_raw(p + 86, 0);  
421 - stw_raw(p + 87, (1 << 14)); 396 + put_le16(p + 59, 0x100 | s->mult_sectors);
  397 + put_le16(p + 60, s->nb_sectors);
  398 + put_le16(p + 61, s->nb_sectors >> 16);
  399 + put_le16(p + 80, (1 << 1) | (1 << 2));
  400 + put_le16(p + 82, (1 << 14));
  401 + put_le16(p + 83, (1 << 14));
  402 + put_le16(p + 84, (1 << 14));
  403 + put_le16(p + 85, (1 << 14));
  404 + put_le16(p + 86, 0);
  405 + put_le16(p + 87, (1 << 14));
422 } 406 }
423 407
424 static void ide_atapi_identify(IDEState *s) 408 static void ide_atapi_identify(IDEState *s)
@@ -428,32 +412,32 @@ static void ide_atapi_identify(IDEState *s) @@ -428,32 +412,32 @@ static void ide_atapi_identify(IDEState *s)
428 memset(s->io_buffer, 0, 512); 412 memset(s->io_buffer, 0, 512);
429 p = (uint16_t *)s->io_buffer; 413 p = (uint16_t *)s->io_buffer;
430 /* Removable CDROM, 50us response, 12 byte packets */ 414 /* Removable CDROM, 50us response, 12 byte packets */
431 - stw_raw(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));  
432 - stw_raw(p + 1, s->cylinders);  
433 - stw_raw(p + 3, s->heads);  
434 - stw_raw(p + 4, 512 * s->sectors); /* sectors */  
435 - stw_raw(p + 5, 512); /* sector size */  
436 - stw_raw(p + 6, s->sectors); 415 + put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
  416 + put_le16(p + 1, s->cylinders);
  417 + put_le16(p + 3, s->heads);
  418 + put_le16(p + 4, 512 * s->sectors); /* sectors */
  419 + put_le16(p + 5, 512); /* sector size */
  420 + put_le16(p + 6, s->sectors);
437 padstr((uint8_t *)(p + 10), "QM00001", 20); /* serial number */ 421 padstr((uint8_t *)(p + 10), "QM00001", 20); /* serial number */
438 - stw_raw(p + 20, 3); /* buffer type */  
439 - stw_raw(p + 21, 512); /* cache size in sectors */  
440 - stw_raw(p + 22, 4); /* ecc bytes */ 422 + put_le16(p + 20, 3); /* buffer type */
  423 + put_le16(p + 21, 512); /* cache size in sectors */
  424 + put_le16(p + 22, 4); /* ecc bytes */
441 padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */ 425 padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */
442 padstr((uint8_t *)(p + 27), "QEMU CD-ROM", 40); /* model */ 426 padstr((uint8_t *)(p + 27), "QEMU CD-ROM", 40); /* model */
443 - stw_raw(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */  
444 - stw_raw(p + 49, 1 << 9); /* LBA supported, no DMA */  
445 - stw_raw(p + 53, 3); /* words 64-70, 54-58 valid */  
446 - stw_raw(p + 63, 0x103); /* DMA modes XXX: may be incorrect */  
447 - stw_raw(p + 64, 1); /* PIO modes */  
448 - stw_raw(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */  
449 - stw_raw(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */  
450 - stw_raw(p + 67, 0x12c); /* minimum PIO cycle time without flow control */  
451 - stw_raw(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */ 427 + put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
  428 + put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
  429 + put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
  430 + put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
  431 + put_le16(p + 64, 1); /* PIO modes */
  432 + put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
  433 + put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
  434 + put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
  435 + put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
452 436
453 - stw_raw(p + 71, 30); /* in ns */  
454 - stw_raw(p + 72, 30); /* in ns */ 437 + put_le16(p + 71, 30); /* in ns */
  438 + put_le16(p + 72, 30); /* in ns */
455 439
456 - stw_raw(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */ 440 + put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
457 } 441 }
458 442
459 static void ide_set_signature(IDEState *s) 443 static void ide_set_signature(IDEState *s)
hw/mc146818rtc.c
@@ -21,26 +21,6 @@ @@ -21,26 +21,6 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdlib.h>  
25 -#include <stdio.h>  
26 -#include <stdarg.h>  
27 -#include <string.h>  
28 -#include <getopt.h>  
29 -#include <inttypes.h>  
30 -#include <unistd.h>  
31 -#include <sys/mman.h>  
32 -#include <fcntl.h>  
33 -#include <signal.h>  
34 -#include <time.h>  
35 -#include <sys/time.h>  
36 -#include <malloc.h>  
37 -#include <termios.h>  
38 -#include <sys/poll.h>  
39 -#include <errno.h>  
40 -#include <sys/wait.h>  
41 -#include <netinet/in.h>  
42 -  
43 -#include "cpu.h"  
44 #include "vl.h" 24 #include "vl.h"
45 25
46 //#define DEBUG_CMOS 26 //#define DEBUG_CMOS
hw/ne2000.c
@@ -21,26 +21,6 @@ @@ -21,26 +21,6 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdlib.h>  
25 -#include <stdio.h>  
26 -#include <stdarg.h>  
27 -#include <string.h>  
28 -#include <getopt.h>  
29 -#include <inttypes.h>  
30 -#include <unistd.h>  
31 -#include <sys/mman.h>  
32 -#include <fcntl.h>  
33 -#include <signal.h>  
34 -#include <time.h>  
35 -#include <sys/time.h>  
36 -#include <malloc.h>  
37 -#include <termios.h>  
38 -#include <sys/poll.h>  
39 -#include <errno.h>  
40 -#include <sys/wait.h>  
41 -#include <netinet/in.h>  
42 -  
43 -#include "cpu.h"  
44 #include "vl.h" 24 #include "vl.h"
45 25
46 /* debug NE2000 card */ 26 /* debug NE2000 card */
@@ -21,26 +21,6 @@ @@ -21,26 +21,6 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdlib.h>  
25 -#include <stdio.h>  
26 -#include <stdarg.h>  
27 -#include <string.h>  
28 -#include <getopt.h>  
29 -#include <inttypes.h>  
30 -#include <unistd.h>  
31 -#include <sys/mman.h>  
32 -#include <fcntl.h>  
33 -#include <signal.h>  
34 -#include <time.h>  
35 -#include <sys/time.h>  
36 -#include <malloc.h>  
37 -#include <termios.h>  
38 -#include <sys/poll.h>  
39 -#include <errno.h>  
40 -#include <sys/wait.h>  
41 -#include <netinet/in.h>  
42 -  
43 -#include "cpu.h"  
44 #include "vl.h" 24 #include "vl.h"
45 25
46 /* output Bochs bios info messages */ 26 /* output Bochs bios info messages */
@@ -393,9 +373,13 @@ void pc_init(int ram_size, int vga_ram_size, int boot_device, @@ -393,9 +373,13 @@ void pc_init(int ram_size, int vga_ram_size, int boot_device,
393 bs_table[2 * i], bs_table[2 * i + 1]); 373 bs_table[2 * i], bs_table[2 * i + 1]);
394 } 374 }
395 kbd_init(); 375 kbd_init();
396 - AUD_init();  
397 DMA_init(); 376 DMA_init();
  377 +
  378 +#ifndef _WIN32
  379 + /* no audio supported yet for win32 */
  380 + AUD_init();
398 SB16_init(); 381 SB16_init();
  382 +#endif
399 383
400 floppy_controller = fdctrl_init(6, 2, 0, 0x3f0, fd_table); 384 floppy_controller = fdctrl_init(6, 2, 0, 0x3f0, fd_table);
401 385
hw/pckbd.c
@@ -21,26 +21,6 @@ @@ -21,26 +21,6 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdlib.h>  
25 -#include <stdio.h>  
26 -#include <stdarg.h>  
27 -#include <string.h>  
28 -#include <getopt.h>  
29 -#include <inttypes.h>  
30 -#include <unistd.h>  
31 -#include <sys/mman.h>  
32 -#include <fcntl.h>  
33 -#include <signal.h>  
34 -#include <time.h>  
35 -#include <sys/time.h>  
36 -#include <malloc.h>  
37 -#include <termios.h>  
38 -#include <sys/poll.h>  
39 -#include <errno.h>  
40 -#include <sys/wait.h>  
41 -#include <netinet/in.h>  
42 -  
43 -#include "cpu.h"  
44 #include "vl.h" 24 #include "vl.h"
45 25
46 /* debug PC keyboard */ 26 /* debug PC keyboard */
hw/sb16.c
@@ -21,11 +21,6 @@ @@ -21,11 +21,6 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdio.h>  
25 -#include <stdlib.h>  
26 -#include <inttypes.h>  
27 -  
28 -#include "cpu.h"  
29 #include "vl.h" 24 #include "vl.h"
30 25
31 #define MIN(a, b) ((a)>(b)?(b):(a)) 26 #define MIN(a, b) ((a)>(b)?(b):(a))
hw/serial.c
@@ -21,26 +21,6 @@ @@ -21,26 +21,6 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdlib.h>  
25 -#include <stdio.h>  
26 -#include <stdarg.h>  
27 -#include <string.h>  
28 -#include <getopt.h>  
29 -#include <inttypes.h>  
30 -#include <unistd.h>  
31 -#include <sys/mman.h>  
32 -#include <fcntl.h>  
33 -#include <signal.h>  
34 -#include <time.h>  
35 -#include <sys/time.h>  
36 -#include <malloc.h>  
37 -#include <termios.h>  
38 -#include <sys/poll.h>  
39 -#include <errno.h>  
40 -#include <sys/wait.h>  
41 -#include <netinet/in.h>  
42 -  
43 -#include "cpu.h"  
44 #include "vl.h" 24 #include "vl.h"
45 25
46 //#define DEBUG_SERIAL 26 //#define DEBUG_SERIAL
hw/vga.c
@@ -21,28 +21,6 @@ @@ -21,28 +21,6 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdlib.h>  
25 -#include <stdio.h>  
26 -#include <stdarg.h>  
27 -#include <string.h>  
28 -#include <getopt.h>  
29 -#include <inttypes.h>  
30 -#include <unistd.h>  
31 -#include <sys/mman.h>  
32 -#include <fcntl.h>  
33 -#include <signal.h>  
34 -#include <time.h>  
35 -#include <sys/time.h>  
36 -#include <malloc.h>  
37 -#include <termios.h>  
38 -#include <sys/poll.h>  
39 -#include <errno.h>  
40 -#include <sys/wait.h>  
41 -#include <netinet/in.h>  
42 -  
43 -#include "cpu.h"  
44 -#include "exec-all.h"  
45 -  
46 #include "vl.h" 24 #include "vl.h"
47 25
48 //#define DEBUG_VGA 26 //#define DEBUG_VGA
monitor.c
@@ -21,25 +21,6 @@ @@ -21,25 +21,6 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdlib.h>  
25 -#include <stdio.h>  
26 -#include <stdarg.h>  
27 -#include <string.h>  
28 -#include <getopt.h>  
29 -#include <inttypes.h>  
30 -#include <unistd.h>  
31 -#include <sys/mman.h>  
32 -#include <fcntl.h>  
33 -#include <signal.h>  
34 -#include <time.h>  
35 -#include <sys/time.h>  
36 -#include <malloc.h>  
37 -#include <termios.h>  
38 -#include <sys/poll.h>  
39 -#include <errno.h>  
40 -#include <ctype.h>  
41 -  
42 -#include "cpu.h"  
43 #include "vl.h" 24 #include "vl.h"
44 25
45 //#define DEBUG 26 //#define DEBUG
@@ -311,6 +292,7 @@ static void do_cont(int argc, const char **argv) @@ -311,6 +292,7 @@ static void do_cont(int argc, const char **argv)
311 vm_start(); 292 vm_start();
312 } 293 }
313 294
  295 +#ifdef CONFIG_GDBSTUB
314 static void do_gdbserver(int argc, const char **argv) 296 static void do_gdbserver(int argc, const char **argv)
315 { 297 {
316 int port; 298 int port;
@@ -324,6 +306,7 @@ static void do_gdbserver(int argc, const char **argv) @@ -324,6 +306,7 @@ static void do_gdbserver(int argc, const char **argv)
324 qemu_printf("Waiting gdb connection on port %d\n", port); 306 qemu_printf("Waiting gdb connection on port %d\n", port);
325 } 307 }
326 } 308 }
  309 +#endif
327 310
328 static term_cmd_t term_cmds[] = { 311 static term_cmd_t term_cmds[] = {
329 { "help|?", do_help, 312 { "help|?", do_help,
@@ -348,7 +331,9 @@ static term_cmd_t term_cmds[] = { @@ -348,7 +331,9 @@ static term_cmd_t term_cmds[] = {
348 "filename", "restore the whole virtual machine state from 'filename'" }, 331 "filename", "restore the whole virtual machine state from 'filename'" },
349 { "stop", do_stop, "", "stop emulation", }, 332 { "stop", do_stop, "", "stop emulation", },
350 { "c|cont", do_cont, "", "resume emulation", }, 333 { "c|cont", do_cont, "", "resume emulation", },
  334 +#ifdef CONFIG_GDBSTUB
351 { "gdbserver", do_gdbserver, "[port]", "start gdbserver session (default port=1234)", }, 335 { "gdbserver", do_gdbserver, "[port]", "start gdbserver session (default port=1234)", },
  336 +#endif
352 { NULL, NULL, }, 337 { NULL, NULL, },
353 }; 338 };
354 339
@@ -25,8 +25,6 @@ @@ -25,8 +25,6 @@
25 #include <stdio.h> 25 #include <stdio.h>
26 #include <stdarg.h> 26 #include <stdarg.h>
27 #include <string.h> 27 #include <string.h>
28 -#include <sys/mman.h>  
29 -#include <sys/ipc.h>  
30 #include <errno.h> 28 #include <errno.h>
31 #include <unistd.h> 29 #include <unistd.h>
32 30
@@ -34,6 +32,9 @@ @@ -34,6 +32,9 @@
34 32
35 #if defined(__i386__) && !defined(CONFIG_SOFTMMU) && !defined(CONFIG_USER_ONLY) 33 #if defined(__i386__) && !defined(CONFIG_SOFTMMU) && !defined(CONFIG_USER_ONLY)
36 34
  35 +#include <sys/mman.h>
  36 +#include <sys/ipc.h>
  37 +
37 /* When not using soft mmu, libc independant functions are needed for 38 /* When not using soft mmu, libc independant functions are needed for
38 the CPU core because it needs to use alternates stacks and 39 the CPU core because it needs to use alternates stacks and
39 libc/thread incompatibles settings */ 40 libc/thread incompatibles settings */
@@ -21,6 +21,9 @@ @@ -21,6 +21,9 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
  24 +#include "vl.h"
  25 +
  26 +#ifndef _WIN32
24 #include <fcntl.h> 27 #include <fcntl.h>
25 #include <errno.h> 28 #include <errno.h>
26 #include <stdio.h> 29 #include <stdio.h>
@@ -33,7 +36,6 @@ @@ -33,7 +36,6 @@
33 #include <sys/ioctl.h> 36 #include <sys/ioctl.h>
34 #include <sys/soundcard.h> 37 #include <sys/soundcard.h>
35 38
36 -#include "vl.h"  
37 39
38 /* http://www.df.lth.se/~john_e/gems/gem002d.html */ 40 /* http://www.df.lth.se/~john_e/gems/gem002d.html */
39 /* http://www.multi-platforms.com/Tips/PopCount.htm */ 41 /* http://www.multi-platforms.com/Tips/PopCount.htm */
@@ -510,3 +512,43 @@ void AUD_init (void) @@ -510,3 +512,43 @@ void AUD_init (void)
510 512
511 conf_fragsize = lsbindex (fsp); 513 conf_fragsize = lsbindex (fsp);
512 } 514 }
  515 +
  516 +#else
  517 +
  518 +void AUD_run (void)
  519 +{
  520 +}
  521 +
  522 +int AUD_write (void *in_buf, int size)
  523 +{
  524 + return 0;
  525 +}
  526 +
  527 +void AUD_reset (int rfreq, int rnchannels, audfmt_e rfmt)
  528 +{
  529 +}
  530 +
  531 +void AUD_adjust_estimate (int _leftover)
  532 +{
  533 +}
  534 +
  535 +int AUD_get_free (void)
  536 +{
  537 + return 0;
  538 +}
  539 +
  540 +int AUD_get_live (void)
  541 +{
  542 + return 0;
  543 +}
  544 +
  545 +int AUD_get_buffer_size (void)
  546 +{
  547 + return 0;
  548 +}
  549 +
  550 +void AUD_init (void)
  551 +{
  552 +}
  553 +
  554 +#endif
qemu-mkcow.c
@@ -28,16 +28,11 @@ @@ -28,16 +28,11 @@
28 #include <getopt.h> 28 #include <getopt.h>
29 #include <inttypes.h> 29 #include <inttypes.h>
30 #include <unistd.h> 30 #include <unistd.h>
31 -#include <sys/mman.h>  
32 #include <fcntl.h> 31 #include <fcntl.h>
33 #include <signal.h> 32 #include <signal.h>
34 #include <time.h> 33 #include <time.h>
35 #include <sys/time.h> 34 #include <sys/time.h>
36 -#include <malloc.h>  
37 -#include <termios.h>  
38 -#include <sys/poll.h>  
39 #include <errno.h> 35 #include <errno.h>
40 -#include <sys/wait.h>  
41 #include <sys/stat.h> 36 #include <sys/stat.h>
42 #include <netinet/in.h> 37 #include <netinet/in.h>
43 38
@@ -21,31 +21,13 @@ @@ -21,31 +21,13 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdlib.h>  
25 -#include <stdio.h>  
26 -#include <stdarg.h>  
27 -#include <string.h>  
28 -#include <getopt.h>  
29 -#include <inttypes.h>  
30 -#include <unistd.h>  
31 -#include <sys/mman.h>  
32 -#include <fcntl.h>  
33 -#include <signal.h>  
34 -#include <time.h>  
35 -#include <sys/time.h>  
36 -#include <malloc.h>  
37 -#include <termios.h>  
38 -#include <sys/poll.h>  
39 -#include <errno.h>  
40 -#include <sys/wait.h>  
41 -#include <netinet/in.h> 24 +#include "vl.h"
42 25
43 #include <SDL.h> 26 #include <SDL.h>
44 27
45 -#include "cpu.h"  
46 -#include "exec-all.h"  
47 -  
48 -#include "vl.h" 28 +#ifndef _WIN32
  29 +#include <signal.h>
  30 +#endif
49 31
50 static SDL_Surface *screen; 32 static SDL_Surface *screen;
51 static int gui_grab; /* if true, all keyboard/mouse events are grabbed */ 33 static int gui_grab; /* if true, all keyboard/mouse events are grabbed */
@@ -291,9 +273,12 @@ void sdl_display_init(DisplayState *ds) @@ -291,9 +273,12 @@ void sdl_display_init(DisplayState *ds)
291 fprintf(stderr, "Could not initialize SDL - exiting\n"); 273 fprintf(stderr, "Could not initialize SDL - exiting\n");
292 exit(1); 274 exit(1);
293 } 275 }
  276 +
  277 +#ifndef _WIN32
294 /* NOTE: we still want Ctrl-C to work, so we undo the SDL redirections */ 278 /* NOTE: we still want Ctrl-C to work, so we undo the SDL redirections */
295 signal(SIGINT, SIG_DFL); 279 signal(SIGINT, SIG_DFL);
296 signal(SIGQUIT, SIG_DFL); 280 signal(SIGQUIT, SIG_DFL);
  281 +#endif
297 282
298 ds->dpy_update = sdl_update; 283 ds->dpy_update = sdl_update;
299 ds->dpy_resize = sdl_resize; 284 ds->dpy_resize = sdl_resize;
target-i386/helper2.c
@@ -24,7 +24,6 @@ @@ -24,7 +24,6 @@
24 #include <inttypes.h> 24 #include <inttypes.h>
25 #include <signal.h> 25 #include <signal.h>
26 #include <assert.h> 26 #include <assert.h>
27 -#include <sys/mman.h>  
28 27
29 #include "cpu.h" 28 #include "cpu.h"
30 #include "exec-all.h" 29 #include "exec-all.h"
@@ -334,7 +333,7 @@ int cpu_x86_handle_mmu_fault(CPUX86State *env, uint32_t addr, @@ -334,7 +333,7 @@ int cpu_x86_handle_mmu_fault(CPUX86State *env, uint32_t addr,
334 if (!(env->cr[0] & CR0_PG_MASK)) { 333 if (!(env->cr[0] & CR0_PG_MASK)) {
335 pte = addr; 334 pte = addr;
336 virt_addr = addr & TARGET_PAGE_MASK; 335 virt_addr = addr & TARGET_PAGE_MASK;
337 - prot = PROT_READ | PROT_WRITE; 336 + prot = PAGE_READ | PAGE_WRITE;
338 page_size = 4096; 337 page_size = 4096;
339 goto do_mapping; 338 goto do_mapping;
340 } 339 }
@@ -409,17 +408,17 @@ int cpu_x86_handle_mmu_fault(CPUX86State *env, uint32_t addr, @@ -409,17 +408,17 @@ int cpu_x86_handle_mmu_fault(CPUX86State *env, uint32_t addr,
409 } 408 }
410 409
411 /* the page can be put in the TLB */ 410 /* the page can be put in the TLB */
412 - prot = PROT_READ; 411 + prot = PAGE_READ;
413 if (pte & PG_DIRTY_MASK) { 412 if (pte & PG_DIRTY_MASK) {
414 /* only set write access if already dirty... otherwise wait 413 /* only set write access if already dirty... otherwise wait
415 for dirty access */ 414 for dirty access */
416 if (is_user) { 415 if (is_user) {
417 if (ptep & PG_RW_MASK) 416 if (ptep & PG_RW_MASK)
418 - prot |= PROT_WRITE; 417 + prot |= PAGE_WRITE;
419 } else { 418 } else {
420 if (!(env->cr[0] & CR0_WP_MASK) || 419 if (!(env->cr[0] & CR0_WP_MASK) ||
421 (ptep & PG_RW_MASK)) 420 (ptep & PG_RW_MASK))
422 - prot |= PROT_WRITE; 421 + prot |= PAGE_WRITE;
423 } 422 }
424 } 423 }
425 424
target-i386/translate-copy.c
@@ -17,15 +17,14 @@ @@ -17,15 +17,14 @@
17 * License along with this library; if not, write to the Free Software 17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */ 19 */
  20 +#include "config.h"
  21 +
20 #include <stdarg.h> 22 #include <stdarg.h>
21 #include <stdlib.h> 23 #include <stdlib.h>
22 #include <stdio.h> 24 #include <stdio.h>
23 #include <string.h> 25 #include <string.h>
24 #include <inttypes.h> 26 #include <inttypes.h>
25 -#include <signal.h>  
26 #include <assert.h> 27 #include <assert.h>
27 -#include <sys/mman.h>  
28 -#include <sys/ucontext.h>  
29 28
30 #include "cpu.h" 29 #include "cpu.h"
31 #include "exec-all.h" 30 #include "exec-all.h"
@@ -33,6 +32,10 @@ @@ -33,6 +32,10 @@
33 32
34 #ifdef USE_CODE_COPY 33 #ifdef USE_CODE_COPY
35 34
  35 +#include <signal.h>
  36 +#include <sys/mman.h>
  37 +#include <sys/ucontext.h>
  38 +
36 extern char exec_loop; 39 extern char exec_loop;
37 40
38 /* operand size */ 41 /* operand size */
target-i386/translate.c
@@ -24,7 +24,6 @@ @@ -24,7 +24,6 @@
24 #include <inttypes.h> 24 #include <inttypes.h>
25 #include <signal.h> 25 #include <signal.h>
26 #include <assert.h> 26 #include <assert.h>
27 -#include <sys/mman.h>  
28 27
29 #include "cpu.h" 28 #include "cpu.h"
30 #include "exec-all.h" 29 #include "exec-all.h"
@@ -21,35 +21,40 @@ @@ -21,35 +21,40 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -#include <stdlib.h>  
25 -#include <stdio.h>  
26 -#include <stdarg.h>  
27 -#include <string.h>  
28 -#include <ctype.h> 24 +#include "vl.h"
  25 +
29 #include <getopt.h> 26 #include <getopt.h>
30 -#include <inttypes.h>  
31 #include <unistd.h> 27 #include <unistd.h>
32 -#include <sys/mman.h>  
33 #include <fcntl.h> 28 #include <fcntl.h>
34 #include <signal.h> 29 #include <signal.h>
35 #include <time.h> 30 #include <time.h>
36 -#include <sys/time.h>  
37 #include <malloc.h> 31 #include <malloc.h>
38 -#include <termios.h>  
39 -#include <sys/poll.h>  
40 #include <errno.h> 32 #include <errno.h>
  33 +#include <sys/time.h>
  34 +
  35 +#ifndef _WIN32
  36 +#include <sys/times.h>
41 #include <sys/wait.h> 37 #include <sys/wait.h>
42 #include <pty.h> 38 #include <pty.h>
43 -#include <sys/times.h>  
44 - 39 +#include <termios.h>
  40 +#include <sys/poll.h>
  41 +#include <sys/mman.h>
45 #include <sys/ioctl.h> 42 #include <sys/ioctl.h>
46 #include <sys/socket.h> 43 #include <sys/socket.h>
47 #include <linux/if.h> 44 #include <linux/if.h>
48 #include <linux/if_tun.h> 45 #include <linux/if_tun.h>
  46 +#endif
  47 +
  48 +#ifdef _WIN32
  49 +#include <sys/timeb.h>
  50 +#include <windows.h>
  51 +#define getopt_long_only getopt_long
  52 +#define memalign(align, size) malloc(size)
  53 +#endif
  54 +
49 55
50 #include "disas.h" 56 #include "disas.h"
51 57
52 -#include "vl.h"  
53 #include "exec-all.h" 58 #include "exec-all.h"
54 59
55 #define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup" 60 #define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup"
@@ -375,11 +380,17 @@ void cpu_disable_ticks(void) @@ -375,11 +380,17 @@ void cpu_disable_ticks(void)
375 } 380 }
376 } 381 }
377 382
378 -int64_t get_clock(void) 383 +static int64_t get_clock(void)
379 { 384 {
  385 +#ifdef _WIN32
  386 + struct _timeb tb;
  387 + _ftime(&tb);
  388 + return ((int64_t)tb.time * 1000 + (int64_t)tb.millitm) * 1000;
  389 +#else
380 struct timeval tv; 390 struct timeval tv;
381 gettimeofday(&tv, NULL); 391 gettimeofday(&tv, NULL);
382 return tv.tv_sec * 1000000LL + tv.tv_usec; 392 return tv.tv_sec * 1000000LL + tv.tv_usec;
  393 +#endif
383 } 394 }
384 395
385 void cpu_calibrate_ticks(void) 396 void cpu_calibrate_ticks(void)
@@ -388,7 +399,11 @@ void cpu_calibrate_ticks(void) @@ -388,7 +399,11 @@ void cpu_calibrate_ticks(void)
388 399
389 usec = get_clock(); 400 usec = get_clock();
390 ticks = cpu_get_real_ticks(); 401 ticks = cpu_get_real_ticks();
  402 +#ifdef _WIN32
  403 + Sleep(50);
  404 +#else
391 usleep(50 * 1000); 405 usleep(50 * 1000);
  406 +#endif
392 usec = get_clock() - usec; 407 usec = get_clock() - usec;
393 ticks = cpu_get_real_ticks() - ticks; 408 ticks = cpu_get_real_ticks() - ticks;
394 ticks_per_sec = (ticks * 1000000LL + (usec >> 1)) / usec; 409 ticks_per_sec = (ticks * 1000000LL + (usec >> 1)) / usec;
@@ -438,8 +453,10 @@ QEMUClock *rt_clock; @@ -438,8 +453,10 @@ QEMUClock *rt_clock;
438 QEMUClock *vm_clock; 453 QEMUClock *vm_clock;
439 454
440 static QEMUTimer *active_timers[2]; 455 static QEMUTimer *active_timers[2];
  456 +#ifndef _WIN32
441 /* frequency of the times() clock tick */ 457 /* frequency of the times() clock tick */
442 static int timer_freq; 458 static int timer_freq;
  459 +#endif
443 460
444 QEMUClock *qemu_new_clock(int type) 461 QEMUClock *qemu_new_clock(int type)
445 { 462 {
@@ -550,12 +567,16 @@ int64_t qemu_get_clock(QEMUClock *clock) @@ -550,12 +567,16 @@ int64_t qemu_get_clock(QEMUClock *clock)
550 { 567 {
551 switch(clock->type) { 568 switch(clock->type) {
552 case QEMU_TIMER_REALTIME: 569 case QEMU_TIMER_REALTIME:
  570 +#ifdef _WIN32
  571 + return GetTickCount();
  572 +#else
553 /* XXX: portability among Linux hosts */ 573 /* XXX: portability among Linux hosts */
554 if (timer_freq == 100) { 574 if (timer_freq == 100) {
555 return times(NULL) * 10; 575 return times(NULL) * 10;
556 } else { 576 } else {
557 return ((int64_t)times(NULL) * 1000) / timer_freq; 577 return ((int64_t)times(NULL) * 1000) / timer_freq;
558 } 578 }
  579 +#endif
559 default: 580 default:
560 case QEMU_TIMER_VIRTUAL: 581 case QEMU_TIMER_VIRTUAL:
561 return cpu_get_ticks(); 582 return cpu_get_ticks();
@@ -608,7 +629,12 @@ static int timer_load(QEMUFile *f, void *opaque, int version_id) @@ -608,7 +629,12 @@ static int timer_load(QEMUFile *f, void *opaque, int version_id)
608 return 0; 629 return 0;
609 } 630 }
610 631
  632 +#ifdef _WIN32
  633 +void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
  634 + DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
  635 +#else
611 static void host_alarm_handler(int host_signum) 636 static void host_alarm_handler(int host_signum)
  637 +#endif
612 { 638 {
613 if (qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL], 639 if (qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
614 qemu_get_clock(vm_clock)) || 640 qemu_get_clock(vm_clock)) ||
@@ -621,39 +647,66 @@ static void host_alarm_handler(int host_signum) @@ -621,39 +647,66 @@ static void host_alarm_handler(int host_signum)
621 647
622 static void init_timers(void) 648 static void init_timers(void)
623 { 649 {
624 - struct sigaction act;  
625 - struct itimerval itv;  
626 -  
627 - /* get times() syscall frequency */  
628 - timer_freq = sysconf(_SC_CLK_TCK);  
629 -  
630 rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME); 650 rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME);
631 vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL); 651 vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL);
632 652
633 - /* timer signal */  
634 - sigfillset(&act.sa_mask);  
635 - act.sa_flags = 0; 653 +#ifdef _WIN32
  654 + {
  655 + int count=0;
  656 + MMRESULT timerID = timeSetEvent(10, // interval (ms)
  657 + 0, // resolution
  658 + host_alarm_handler, // function
  659 + (DWORD)&count, // user parameter
  660 + TIME_PERIODIC | TIME_CALLBACK_FUNCTION);
  661 + if( !timerID ) {
  662 + perror("failed timer alarm");
  663 + exit(1);
  664 + }
  665 + }
  666 + pit_min_timer_count = ((uint64_t)10000 * PIT_FREQ) / 1000000;
  667 +#else
  668 + {
  669 + struct sigaction act;
  670 + struct itimerval itv;
  671 +
  672 + /* get times() syscall frequency */
  673 + timer_freq = sysconf(_SC_CLK_TCK);
  674 +
  675 + /* timer signal */
  676 + sigfillset(&act.sa_mask);
  677 + act.sa_flags = 0;
636 #if defined (TARGET_I386) && defined(USE_CODE_COPY) 678 #if defined (TARGET_I386) && defined(USE_CODE_COPY)
637 - act.sa_flags |= SA_ONSTACK; 679 + act.sa_flags |= SA_ONSTACK;
  680 +#endif
  681 + act.sa_handler = host_alarm_handler;
  682 + sigaction(SIGALRM, &act, NULL);
  683 +
  684 + itv.it_interval.tv_sec = 0;
  685 + itv.it_interval.tv_usec = 1000;
  686 + itv.it_value.tv_sec = 0;
  687 + itv.it_value.tv_usec = 10 * 1000;
  688 + setitimer(ITIMER_REAL, &itv, NULL);
  689 + /* we probe the tick duration of the kernel to inform the user if
  690 + the emulated kernel requested a too high timer frequency */
  691 + getitimer(ITIMER_REAL, &itv);
  692 + pit_min_timer_count = ((uint64_t)itv.it_interval.tv_usec * PIT_FREQ) /
  693 + 1000000;
  694 + }
638 #endif 695 #endif
639 - act.sa_handler = host_alarm_handler;  
640 - sigaction(SIGALRM, &act, NULL);  
641 -  
642 - itv.it_interval.tv_sec = 0;  
643 - itv.it_interval.tv_usec = 1000;  
644 - itv.it_value.tv_sec = 0;  
645 - itv.it_value.tv_usec = 10 * 1000;  
646 - setitimer(ITIMER_REAL, &itv, NULL);  
647 - /* we probe the tick duration of the kernel to inform the user if  
648 - the emulated kernel requested a too high timer frequency */  
649 - getitimer(ITIMER_REAL, &itv);  
650 - pit_min_timer_count = ((uint64_t)itv.it_interval.tv_usec * PIT_FREQ) /  
651 - 1000000;  
652 } 696 }
653 697
654 /***********************************************************/ 698 /***********************************************************/
655 /* serial device */ 699 /* serial device */
656 700
  701 +#ifdef _WIN32
  702 +
  703 +int serial_open_device(void)
  704 +{
  705 + return -1;
  706 +}
  707 +
  708 +#else
  709 +
657 int serial_open_device(void) 710 int serial_open_device(void)
658 { 711 {
659 char slave_name[1024]; 712 char slave_name[1024];
@@ -672,9 +725,24 @@ int serial_open_device(void) @@ -672,9 +725,24 @@ int serial_open_device(void)
672 } 725 }
673 } 726 }
674 727
  728 +#endif
  729 +
675 /***********************************************************/ 730 /***********************************************************/
676 /* Linux network device redirector */ 731 /* Linux network device redirector */
677 732
  733 +#ifdef _WIN32
  734 +
  735 +static int net_init(void)
  736 +{
  737 + return 0;
  738 +}
  739 +
  740 +void net_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
  741 +{
  742 +}
  743 +
  744 +#else
  745 +
678 static int tun_open(char *ifname, int ifname_size) 746 static int tun_open(char *ifname, int ifname_size)
679 { 747 {
680 struct ifreq ifr; 748 struct ifreq ifr;
@@ -753,9 +821,23 @@ void net_send_packet(NetDriverState *nd, const uint8_t *buf, int size) @@ -753,9 +821,23 @@ void net_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
753 write(nd->fd, buf, size); 821 write(nd->fd, buf, size);
754 } 822 }
755 823
  824 +#endif
  825 +
756 /***********************************************************/ 826 /***********************************************************/
757 /* dumb display */ 827 /* dumb display */
758 828
  829 +#ifdef _WIN32
  830 +
  831 +static void term_exit(void)
  832 +{
  833 +}
  834 +
  835 +static void term_init(void)
  836 +{
  837 +}
  838 +
  839 +#else
  840 +
759 /* init terminal so that we can grab keys */ 841 /* init terminal so that we can grab keys */
760 static struct termios oldtty; 842 static struct termios oldtty;
761 843
@@ -790,6 +872,8 @@ static void term_init(void) @@ -790,6 +872,8 @@ static void term_init(void)
790 fcntl(0, F_SETFL, O_NONBLOCK); 872 fcntl(0, F_SETFL, O_NONBLOCK);
791 } 873 }
792 874
  875 +#endif
  876 +
793 static void dumb_update(DisplayState *ds, int x, int y, int w, int h) 877 static void dumb_update(DisplayState *ds, int x, int y, int w, int h)
794 { 878 {
795 } 879 }
@@ -1396,10 +1480,13 @@ void vm_stop(int reason) @@ -1396,10 +1480,13 @@ void vm_stop(int reason)
1396 1480
1397 int main_loop(void) 1481 int main_loop(void)
1398 { 1482 {
  1483 +#ifndef _WIN32
1399 struct pollfd ufds[MAX_IO_HANDLERS + 1], *pf; 1484 struct pollfd ufds[MAX_IO_HANDLERS + 1], *pf;
1400 - int ret, n, timeout, max_size;  
1401 - uint8_t buf[4096];  
1402 IOHandlerRecord *ioh, *ioh_next; 1485 IOHandlerRecord *ioh, *ioh_next;
  1486 + uint8_t buf[4096];
  1487 + int n, max_size;
  1488 +#endif
  1489 + int ret, timeout;
1403 CPUState *env = global_env; 1490 CPUState *env = global_env;
1404 1491
1405 for(;;) { 1492 for(;;) {
@@ -1422,6 +1509,7 @@ int main_loop(void) @@ -1422,6 +1509,7 @@ int main_loop(void)
1422 timeout = 10; 1509 timeout = 10;
1423 } 1510 }
1424 1511
  1512 +#ifndef _WIN32
1425 /* poll any events */ 1513 /* poll any events */
1426 /* XXX: separate device handlers from system ones */ 1514 /* XXX: separate device handlers from system ones */
1427 pf = ufds; 1515 pf = ufds;
@@ -1471,6 +1559,7 @@ int main_loop(void) @@ -1471,6 +1559,7 @@ int main_loop(void)
1471 } 1559 }
1472 } 1560 }
1473 } 1561 }
  1562 +#endif
1474 1563
1475 if (vm_running) { 1564 if (vm_running) {
1476 qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL], 1565 qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
@@ -1592,7 +1681,10 @@ static uint8_t *signal_stack; @@ -1592,7 +1681,10 @@ static uint8_t *signal_stack;
1592 1681
1593 int main(int argc, char **argv) 1682 int main(int argc, char **argv)
1594 { 1683 {
1595 - int c, i, use_gdbstub, gdbstub_port, long_index, has_cdrom; 1684 +#ifdef CONFIG_GDBSTUB
  1685 + int use_gdbstub, gdbstub_port;
  1686 +#endif
  1687 + int c, i, long_index, has_cdrom;
1596 int snapshot, linux_boot; 1688 int snapshot, linux_boot;
1597 CPUState *env; 1689 CPUState *env;
1598 const char *initrd_filename; 1690 const char *initrd_filename;
@@ -1601,8 +1693,10 @@ int main(int argc, char **argv) @@ -1601,8 +1693,10 @@ int main(int argc, char **argv)
1601 DisplayState *ds = &display_state; 1693 DisplayState *ds = &display_state;
1602 int cyls, heads, secs; 1694 int cyls, heads, secs;
1603 1695
  1696 +#if !defined(CONFIG_SOFTMMU)
1604 /* we never want that malloc() uses mmap() */ 1697 /* we never want that malloc() uses mmap() */
1605 mallopt(M_MMAP_THRESHOLD, 4096 * 1024); 1698 mallopt(M_MMAP_THRESHOLD, 4096 * 1024);
  1699 +#endif
1606 initrd_filename = NULL; 1700 initrd_filename = NULL;
1607 for(i = 0; i < MAX_FD; i++) 1701 for(i = 0; i < MAX_FD; i++)
1608 fd_filename[i] = NULL; 1702 fd_filename[i] = NULL;
@@ -1611,8 +1705,10 @@ int main(int argc, char **argv) @@ -1611,8 +1705,10 @@ int main(int argc, char **argv)
1611 ram_size = 32 * 1024 * 1024; 1705 ram_size = 32 * 1024 * 1024;
1612 vga_ram_size = VGA_RAM_SIZE; 1706 vga_ram_size = VGA_RAM_SIZE;
1613 pstrcpy(network_script, sizeof(network_script), DEFAULT_NETWORK_SCRIPT); 1707 pstrcpy(network_script, sizeof(network_script), DEFAULT_NETWORK_SCRIPT);
  1708 +#ifdef CONFIG_GDBSTUB
1614 use_gdbstub = 0; 1709 use_gdbstub = 0;
1615 gdbstub_port = DEFAULT_GDBSTUB_PORT; 1710 gdbstub_port = DEFAULT_GDBSTUB_PORT;
  1711 +#endif
1616 snapshot = 0; 1712 snapshot = 0;
1617 nographic = 0; 1713 nographic = 0;
1618 kernel_filename = NULL; 1714 kernel_filename = NULL;
@@ -1773,12 +1869,14 @@ int main(int argc, char **argv) @@ -1773,12 +1869,14 @@ int main(int argc, char **argv)
1773 case 'n': 1869 case 'n':
1774 pstrcpy(network_script, sizeof(network_script), optarg); 1870 pstrcpy(network_script, sizeof(network_script), optarg);
1775 break; 1871 break;
  1872 +#ifdef CONFIG_GDBSTUB
1776 case 's': 1873 case 's':
1777 use_gdbstub = 1; 1874 use_gdbstub = 1;
1778 break; 1875 break;
1779 case 'p': 1876 case 'p':
1780 gdbstub_port = atoi(optarg); 1877 gdbstub_port = atoi(optarg);
1781 break; 1878 break;
  1879 +#endif
1782 case 'L': 1880 case 'L':
1783 bios_dir = optarg; 1881 bios_dir = optarg;
1784 break; 1882 break;
@@ -1976,6 +2074,7 @@ int main(int argc, char **argv) @@ -1976,6 +2074,7 @@ int main(int argc, char **argv)
1976 } 2074 }
1977 #endif 2075 #endif
1978 2076
  2077 +#ifndef _WIN32
1979 { 2078 {
1980 struct sigaction act; 2079 struct sigaction act;
1981 sigfillset(&act.sa_mask); 2080 sigfillset(&act.sa_mask);
@@ -1983,10 +2082,12 @@ int main(int argc, char **argv) @@ -1983,10 +2082,12 @@ int main(int argc, char **argv)
1983 act.sa_handler = SIG_IGN; 2082 act.sa_handler = SIG_IGN;
1984 sigaction(SIGPIPE, &act, NULL); 2083 sigaction(SIGPIPE, &act, NULL);
1985 } 2084 }
  2085 +#endif
1986 2086
1987 gui_timer = qemu_new_timer(rt_clock, gui_update, NULL); 2087 gui_timer = qemu_new_timer(rt_clock, gui_update, NULL);
1988 qemu_mod_timer(gui_timer, qemu_get_clock(rt_clock)); 2088 qemu_mod_timer(gui_timer, qemu_get_clock(rt_clock));
1989 2089
  2090 +#ifdef CONFIG_GDBSTUB
1990 if (use_gdbstub) { 2091 if (use_gdbstub) {
1991 if (gdbserver_start(gdbstub_port) < 0) { 2092 if (gdbserver_start(gdbstub_port) < 0) {
1992 fprintf(stderr, "Could not open gdbserver socket on port %d\n", 2093 fprintf(stderr, "Could not open gdbserver socket on port %d\n",
@@ -1995,7 +2096,9 @@ int main(int argc, char **argv) @@ -1995,7 +2096,9 @@ int main(int argc, char **argv)
1995 } else { 2096 } else {
1996 printf("Waiting gdb connection on port %d\n", gdbstub_port); 2097 printf("Waiting gdb connection on port %d\n", gdbstub_port);
1997 } 2098 }
1998 - } else { 2099 + } else
  2100 +#endif
  2101 + {
1999 vm_start(); 2102 vm_start();
2000 } 2103 }
2001 term_init(); 2104 term_init();
@@ -24,10 +24,79 @@ @@ -24,10 +24,79 @@
24 #ifndef VL_H 24 #ifndef VL_H
25 #define VL_H 25 #define VL_H
26 26
  27 +/* we put basic includes here to avoid repeating them in device drivers */
  28 +#include <stdlib.h>
  29 +#include <stdio.h>
  30 +#include <stdarg.h>
  31 +#include <string.h>
  32 +#include <inttypes.h>
27 #include <time.h> 33 #include <time.h>
  34 +#include <ctype.h>
  35 +#include <errno.h>
  36 +#include <unistd.h>
  37 +#include <fcntl.h>
  38 +
  39 +#ifndef O_LARGEFILE
  40 +#define O_LARGEFILE 0
  41 +#endif
  42 +
  43 +#ifdef _WIN32
  44 +#define lseek64 lseek
  45 +#endif
28 46
29 #include "cpu.h" 47 #include "cpu.h"
30 48
  49 +#ifndef glue
  50 +#define xglue(x, y) x ## y
  51 +#define glue(x, y) xglue(x, y)
  52 +#define stringify(s) tostring(s)
  53 +#define tostring(s) #s
  54 +#endif
  55 +
  56 +#if defined(WORDS_BIGENDIAN)
  57 +static inline uint32_t be32_to_cpu(uint32_t v)
  58 +{
  59 + return v;
  60 +}
  61 +
  62 +static inline uint16_t be16_to_cpu(uint16_t v)
  63 +{
  64 + return v;
  65 +}
  66 +
  67 +static inline uint32_t le32_to_cpu(uint32_t v)
  68 +{
  69 + return bswap32(v);
  70 +}
  71 +
  72 +static inline uint16_t le16_to_cpu(uint16_t v)
  73 +{
  74 + return bswap16(v);
  75 +}
  76 +
  77 +#else
  78 +static inline uint32_t be32_to_cpu(uint32_t v)
  79 +{
  80 + return bswap32(v);
  81 +}
  82 +
  83 +static inline uint16_t be16_to_cpu(uint16_t v)
  84 +{
  85 + return bswap16(v);
  86 +}
  87 +
  88 +static inline uint32_t le32_to_cpu(uint32_t v)
  89 +{
  90 + return v;
  91 +}
  92 +
  93 +static inline uint16_t le16_to_cpu(uint16_t v)
  94 +{
  95 + return v;
  96 +}
  97 +#endif
  98 +
  99 +
31 /* vl.c */ 100 /* vl.c */
32 extern int reset_requested; 101 extern int reset_requested;
33 102