win32 port (initial patch by kazu)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@692 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
bb27c19087
commit
67b915a5dd
@ -24,6 +24,7 @@ version 0.5.3:
|
||||
- VM save/restore commands
|
||||
- new timer API
|
||||
- more precise RTC emulation (periodic timers + time updates)
|
||||
- Win32 port (initial patch by Kazu)
|
||||
|
||||
version 0.5.2:
|
||||
|
||||
|
11
Makefile
11
Makefile
@ -1,12 +1,17 @@
|
||||
include config-host.mak
|
||||
|
||||
CFLAGS=-Wall -O2 -g
|
||||
ifdef CONFIG_WIN32
|
||||
CFLAGS+=-fpack-struct
|
||||
endif
|
||||
LDFLAGS=-g
|
||||
LIBS=
|
||||
DEFINES+=-D_GNU_SOURCE
|
||||
ifndef CONFIG_WIN32
|
||||
TOOLS=qemu-mkcow
|
||||
endif
|
||||
|
||||
all: dyngen $(TOOLS) qemu-doc.html qemu.1
|
||||
all: dyngen$(EXESUF) $(TOOLS) qemu-doc.html qemu.1
|
||||
for d in $(TARGET_DIRS); do \
|
||||
make -C $$d $@ || exit 1 ; \
|
||||
done
|
||||
@ -14,7 +19,7 @@ all: dyngen $(TOOLS) qemu-doc.html qemu.1
|
||||
qemu-mkcow: qemu-mkcow.o
|
||||
$(HOST_CC) -o $@ $^ $(LIBS)
|
||||
|
||||
dyngen: dyngen.o
|
||||
dyngen$(EXESUF): dyngen.o
|
||||
$(HOST_CC) -o $@ $^ $(LIBS)
|
||||
|
||||
%.o: %.c
|
||||
@ -23,7 +28,7 @@ dyngen: dyngen.o
|
||||
clean:
|
||||
# avoid old build problems by removing potentially incorrect old files
|
||||
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
|
||||
rm -f *.o *.a $(TOOLS) dyngen TAGS qemu.pod
|
||||
rm -f *.o *.a $(TOOLS) dyngen$(EXESUF) TAGS qemu.pod
|
||||
make -C tests clean
|
||||
for d in $(TARGET_DIRS); do \
|
||||
make -C $$d $@ || exit 1 ; \
|
||||
|
@ -11,12 +11,12 @@ CFLAGS=-Wall -O2 -g
|
||||
LDFLAGS=-g
|
||||
LIBS=
|
||||
HELPER_CFLAGS=$(CFLAGS)
|
||||
DYNGEN=../dyngen
|
||||
DYNGEN=../dyngen$(EXESUF)
|
||||
# user emulator name
|
||||
QEMU_USER=qemu-$(TARGET_ARCH)
|
||||
# system emulator name
|
||||
ifdef CONFIG_SOFTMMU
|
||||
QEMU_SYSTEM=qemu
|
||||
QEMU_SYSTEM=qemu$(EXESUF)
|
||||
else
|
||||
QEMU_SYSTEM=qemu-fast
|
||||
endif
|
||||
@ -146,6 +146,9 @@ endif
|
||||
|
||||
DEFINES+=-D_GNU_SOURCE
|
||||
LIBS+=-lm
|
||||
ifdef CONFIG_WIN32
|
||||
LIBS+=-lwinmm
|
||||
endif
|
||||
|
||||
# profiling code
|
||||
ifdef TARGET_GPROF
|
||||
@ -219,9 +222,12 @@ ifeq ($(ARCH),alpha)
|
||||
endif
|
||||
|
||||
# must use static linking to avoid leaving stuff in virtual address space
|
||||
VL_OBJS=vl.o osdep.o block.o monitor.o gdbstub.o \
|
||||
VL_OBJS=vl.o osdep.o block.o monitor.o \
|
||||
ide.o ne2000.o pckbd.o vga.o sb16.o dma.o oss.o \
|
||||
fdc.o mc146818rtc.o serial.o i8259.o i8254.o pc.o
|
||||
ifdef CONFIG_GDBSTUB
|
||||
VL_OBJS+=gdbstub.o
|
||||
endif
|
||||
ifeq ($(TARGET_ARCH), ppc)
|
||||
VL_OBJS+= hw.o
|
||||
endif
|
||||
|
5
TODO
5
TODO
@ -1,9 +1,12 @@
|
||||
short term:
|
||||
----------
|
||||
- handle fast timers + add explicit clocks
|
||||
- OS/2 install bug
|
||||
- win 95 install bug
|
||||
- handle Self Modifying Code even if modifying current TB (BE OS 5 install)
|
||||
- physical memory cache (reduce qemu-fast address space size to about 32 MB)
|
||||
- better code fetch
|
||||
- XP security bug
|
||||
- handle Self Modifying Code even if modifying current TB (BE OS 5 install)
|
||||
- cycle counter for all archs
|
||||
- TLB code protection support for PPC
|
||||
- add sysenter/sysexit and fxsr for L4 pistachio 686
|
||||
|
54
block.c
54
block.c
@ -21,29 +21,11 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <malloc.h>
|
||||
#include <termios.h>
|
||||
#include <sys/poll.h>
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "vl.h"
|
||||
|
||||
#define NO_THUNK_TYPE_SIZE
|
||||
#include "thunk.h"
|
||||
#ifndef _WIN32
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
|
||||
#include "cow.h"
|
||||
|
||||
@ -97,11 +79,14 @@ BlockDriverState *bdrv_new(const char *device_name)
|
||||
|
||||
int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot)
|
||||
{
|
||||
int fd, cow_fd;
|
||||
int fd;
|
||||
int64_t size;
|
||||
char template[] = "/tmp/vl.XXXXXX";
|
||||
struct cow_header_v2 cow_header;
|
||||
#ifndef _WIN32
|
||||
char template[] = "/tmp/vl.XXXXXX";
|
||||
int cow_fd;
|
||||
struct stat st;
|
||||
#endif
|
||||
|
||||
bs->read_only = 0;
|
||||
bs->fd = -1;
|
||||
@ -110,10 +95,18 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot)
|
||||
strcpy(bs->filename, filename);
|
||||
|
||||
/* open standard HD image */
|
||||
#ifdef _WIN32
|
||||
fd = open(filename, O_RDWR | O_BINARY);
|
||||
#else
|
||||
fd = open(filename, O_RDWR | O_LARGEFILE);
|
||||
#endif
|
||||
if (fd < 0) {
|
||||
/* read only image on disk */
|
||||
#ifdef _WIN32
|
||||
fd = open(filename, O_RDONLY | O_BINARY);
|
||||
#else
|
||||
fd = open(filename, O_RDONLY | O_LARGEFILE);
|
||||
#endif
|
||||
if (fd < 0) {
|
||||
perror(filename);
|
||||
goto fail;
|
||||
@ -128,8 +121,9 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot)
|
||||
fprintf(stderr, "%s: could not read header\n", filename);
|
||||
goto fail;
|
||||
}
|
||||
if (cow_header.magic == htonl(COW_MAGIC) &&
|
||||
cow_header.version == htonl(COW_VERSION)) {
|
||||
#ifndef _WIN32
|
||||
if (be32_to_cpu(cow_header.magic) == COW_MAGIC &&
|
||||
be32_to_cpu(cow_header.version) == COW_VERSION) {
|
||||
/* cow image found */
|
||||
size = cow_header.size;
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
@ -144,7 +138,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot)
|
||||
fprintf(stderr, "%s: could not find original disk image '%s'\n", filename, cow_header.backing_file);
|
||||
goto fail;
|
||||
}
|
||||
if (st.st_mtime != htonl(cow_header.mtime)) {
|
||||
if (st.st_mtime != be32_to_cpu(cow_header.mtime)) {
|
||||
fprintf(stderr, "%s: original raw disk image '%s' does not match saved timestamp\n", filename, cow_header.backing_file);
|
||||
goto fail;
|
||||
}
|
||||
@ -164,13 +158,16 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot)
|
||||
bs->cow_bitmap = bs->cow_bitmap_addr + sizeof(cow_header);
|
||||
bs->cow_sectors_offset = (bs->cow_bitmap_size + 511) & ~511;
|
||||
snapshot = 0;
|
||||
} else {
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
/* standard raw image */
|
||||
size = lseek64(fd, 0, SEEK_END);
|
||||
bs->total_sectors = size / 512;
|
||||
bs->fd = fd;
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
if (snapshot) {
|
||||
/* create a temporary COW file */
|
||||
cow_fd = mkstemp(template);
|
||||
@ -190,6 +187,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot)
|
||||
bs->cow_bitmap = bs->cow_bitmap_addr;
|
||||
bs->cow_sectors_offset = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
bs->inserted = 1;
|
||||
|
||||
@ -206,9 +204,11 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot)
|
||||
void bdrv_close(BlockDriverState *bs)
|
||||
{
|
||||
if (bs->inserted) {
|
||||
#ifndef _WIN32
|
||||
/* we unmap the mapping so that it is written to the COW file */
|
||||
if (bs->cow_bitmap_addr)
|
||||
munmap(bs->cow_bitmap_addr, bs->cow_bitmap_size);
|
||||
#endif
|
||||
if (bs->cow_fd >= 0)
|
||||
close(bs->cow_fd);
|
||||
if (bs->fd >= 0)
|
||||
|
30
configure
vendored
30
configure
vendored
@ -68,10 +68,16 @@ case "$cpu" in
|
||||
esac
|
||||
gprof="no"
|
||||
bigendian="no"
|
||||
mingw32="no"
|
||||
EXESUF=""
|
||||
gdbstub="yes"
|
||||
|
||||
# OS specific
|
||||
targetos=`uname -s`
|
||||
case $targetos in
|
||||
MINGW32*)
|
||||
mingw32="yes"
|
||||
;;
|
||||
*) ;;
|
||||
esac
|
||||
|
||||
@ -136,6 +142,8 @@ for opt do
|
||||
;;
|
||||
--disable-sdl) sdl="no"
|
||||
;;
|
||||
--enable-mingw32) mingw32="yes" ; cross_prefix="i386-mingw32-"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
@ -148,6 +156,14 @@ cc="${cross_prefix}${cc}"
|
||||
ar="${cross_prefix}${ar}"
|
||||
strip="${cross_prefix}${strip}"
|
||||
|
||||
if test "$mingw32" = "yes" ; then
|
||||
host_cc="$cc"
|
||||
target_list="i386-softmmu"
|
||||
prefix="/c/Program Files/Qemu"
|
||||
EXESUF=".exe"
|
||||
gdbstub="no"
|
||||
fi
|
||||
|
||||
if test -z "$cross_prefix" ; then
|
||||
|
||||
# ---
|
||||
@ -206,6 +222,7 @@ echo " --cross-prefix=PREFIX use PREFIX for compile tools [$cross_prefix]"
|
||||
echo " --cc=CC use C compiler CC [$cc]"
|
||||
echo " --make=MAKE use specified make [$make]"
|
||||
echo " --static enable static build [$static]"
|
||||
echo " --enable-mingw32 enable Win32 cross compilation with mingw32"
|
||||
echo ""
|
||||
echo "NOTE: The object files are build at the place where configure is launched"
|
||||
exit 1
|
||||
@ -227,6 +244,8 @@ echo "target list $target_list"
|
||||
echo "gprof enabled $gprof"
|
||||
echo "static build $static"
|
||||
echo "SDL support $sdl"
|
||||
echo "mingw32 support $mingw32"
|
||||
|
||||
if test $sdl_too_old = "yes"; then
|
||||
echo "-> Your SDL version is too old - please upgrade to have FFplay/SDL support"
|
||||
fi
|
||||
@ -253,6 +272,7 @@ echo "AR=$ar" >> $config_mak
|
||||
echo "STRIP=$strip -s -R .comment -R .note" >> $config_mak
|
||||
echo "CFLAGS=$CFLAGS" >> $config_mak
|
||||
echo "LDFLAGS=$LDFLAGS" >> $config_mak
|
||||
echo "EXESUF=$EXESUF" >> $config_mak
|
||||
if test "$cpu" = "i386" ; then
|
||||
echo "ARCH=i386" >> $config_mak
|
||||
echo "#define HOST_I386 1" >> $config_h
|
||||
@ -294,7 +314,15 @@ if test "$bigendian" = "yes" ; then
|
||||
echo "WORDS_BIGENDIAN=yes" >> $config_mak
|
||||
echo "#define WORDS_BIGENDIAN 1" >> $config_h
|
||||
fi
|
||||
echo "#define HAVE_BYTESWAP_H 1" >> $config_h
|
||||
if test "$mingw32" = "yes" ; then
|
||||
echo "CONFIG_WIN32=yes" >> $config_mak
|
||||
else
|
||||
echo "#define HAVE_BYTESWAP_H 1" >> $config_h
|
||||
fi
|
||||
if test "$gdbstub" = "yes" ; then
|
||||
echo "CONFIG_GDBSTUB=yes" >> $config_mak
|
||||
echo "#define CONFIG_GDBSTUB 1" >> $config_h
|
||||
fi
|
||||
if test "$gprof" = "yes" ; then
|
||||
echo "TARGET_GPROF=yes" >> $config_mak
|
||||
echo "#define HAVE_GPROF 1" >> $config_h
|
||||
|
@ -592,6 +592,8 @@ void cpu_x86_frstor(CPUX86State *s, uint8_t *ptr, int data32)
|
||||
|
||||
#endif /* TARGET_I386 */
|
||||
|
||||
#if !defined(CONFIG_SOFTMMU)
|
||||
|
||||
#undef EAX
|
||||
#undef ECX
|
||||
#undef EDX
|
||||
@ -925,3 +927,5 @@ int cpu_signal_handler(int host_signum, struct siginfo *info,
|
||||
#error host CPU specific signal handler needed
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* !defined(CONFIG_SOFTMMU) */
|
||||
|
12
exec-all.h
12
exec-all.h
@ -141,7 +141,7 @@ int tlb_set_page(CPUState *env, uint32_t vaddr, uint32_t paddr, int prot,
|
||||
#if defined(__powerpc__)
|
||||
#define USE_DIRECT_JUMP
|
||||
#endif
|
||||
#if defined(__i386__)
|
||||
#if defined(__i386__) && !defined(_WIN32)
|
||||
#define USE_DIRECT_JUMP
|
||||
#endif
|
||||
|
||||
@ -322,13 +322,19 @@ do {\
|
||||
|
||||
#elif defined(__i386__) && defined(USE_DIRECT_JUMP)
|
||||
|
||||
#ifdef _WIN32
|
||||
#define ASM_PREVIOUS_SECTION ".section .text\n"
|
||||
#else
|
||||
#define ASM_PREVIOUS_SECTION ".previous\n"
|
||||
#endif
|
||||
|
||||
/* we patch the jump instruction directly */
|
||||
#define JUMP_TB(opname, tbparam, n, eip)\
|
||||
do {\
|
||||
asm volatile (".section \".data\"\n"\
|
||||
asm volatile (".section .data\n"\
|
||||
"__op_label" #n "." stringify(opname) ":\n"\
|
||||
".long 1f\n"\
|
||||
".previous\n"\
|
||||
ASM_PREVIOUS_SECTION \
|
||||
"jmp __op_jmp" #n "\n"\
|
||||
"1:\n");\
|
||||
T0 = (long)(tbparam) + (n);\
|
||||
|
12
exec.c
12
exec.c
@ -17,6 +17,7 @@
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include "config.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
@ -24,9 +25,10 @@
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <inttypes.h>
|
||||
#if !defined(CONFIG_SOFTMMU)
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
|
||||
#include "config.h"
|
||||
#include "cpu.h"
|
||||
#include "exec-all.h"
|
||||
|
||||
@ -121,7 +123,11 @@ static void page_init(void)
|
||||
{
|
||||
/* NOTE: we can always suppose that host_page_size >=
|
||||
TARGET_PAGE_SIZE */
|
||||
#ifdef _WIN32
|
||||
real_host_page_size = 4096;
|
||||
#else
|
||||
real_host_page_size = getpagesize();
|
||||
#endif
|
||||
if (host_page_size == 0)
|
||||
host_page_size = real_host_page_size;
|
||||
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,
|
||||
|
||||
index = (vaddr >> 12) & (CPU_TLB_SIZE - 1);
|
||||
addend -= vaddr;
|
||||
if (prot & PROT_READ) {
|
||||
if (prot & PAGE_READ) {
|
||||
env->tlb_read[is_user][index].address = address;
|
||||
env->tlb_read[is_user][index].addend = addend;
|
||||
} else {
|
||||
env->tlb_read[is_user][index].address = -1;
|
||||
env->tlb_read[is_user][index].addend = -1;
|
||||
}
|
||||
if (prot & PROT_WRITE) {
|
||||
if (prot & PAGE_WRITE) {
|
||||
if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_ROM) {
|
||||
/* ROM: access is ignored (same as unassigned) */
|
||||
env->tlb_write[is_user][index].address = vaddr | IO_MEM_ROM;
|
||||
|
10
gdbstub.c
10
gdbstub.c
@ -17,18 +17,12 @@
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include "vl.h"
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <signal.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "vl.h"
|
||||
|
||||
//#define DEBUG_GDB
|
||||
|
||||
|
5
hw/dma.c
5
hw/dma.c
@ -21,11 +21,6 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "vl.h"
|
||||
|
||||
#define log(...) fprintf (stderr, "dma: " __VA_ARGS__)
|
||||
|
5
hw/fdc.c
5
hw/fdc.c
@ -21,11 +21,6 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "vl.h"
|
||||
|
||||
/********************************************************/
|
||||
|
20
hw/i8254.c
20
hw/i8254.c
@ -21,26 +21,6 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <malloc.h>
|
||||
#include <termios.h>
|
||||
#include <sys/poll.h>
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "vl.h"
|
||||
|
||||
//#define DEBUG_PIT
|
||||
|
20
hw/i8259.c
20
hw/i8259.c
@ -21,26 +21,6 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <malloc.h>
|
||||
#include <termios.h>
|
||||
#include <sys/poll.h>
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "vl.h"
|
||||
|
||||
/* debug PIC */
|
||||
|
136
hw/ide.c
136
hw/ide.c
@ -21,31 +21,6 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <malloc.h>
|
||||
#include <termios.h>
|
||||
#include <sys/poll.h>
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#define NO_THUNK_TYPE_SIZE
|
||||
#include "thunk.h"
|
||||
|
||||
#include "cpu.h"
|
||||
#include "exec-all.h"
|
||||
|
||||
#include "vl.h"
|
||||
|
||||
/* debug IDE devices */
|
||||
@ -375,6 +350,15 @@ static void padstr8(uint8_t *buf, int buf_size, const char *src)
|
||||
}
|
||||
}
|
||||
|
||||
static void put_le16(uint16_t *p, unsigned int v)
|
||||
{
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
*p = bswap16(v);
|
||||
#else
|
||||
*p = v;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void ide_identify(IDEState *s)
|
||||
{
|
||||
uint16_t *p;
|
||||
@ -382,43 +366,43 @@ static void ide_identify(IDEState *s)
|
||||
|
||||
memset(s->io_buffer, 0, 512);
|
||||
p = (uint16_t *)s->io_buffer;
|
||||
stw_raw(p + 0, 0x0040);
|
||||
stw_raw(p + 1, s->cylinders);
|
||||
stw_raw(p + 3, s->heads);
|
||||
stw_raw(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
|
||||
stw_raw(p + 5, 512); /* XXX: retired, remove ? */
|
||||
stw_raw(p + 6, s->sectors);
|
||||
put_le16(p + 0, 0x0040);
|
||||
put_le16(p + 1, s->cylinders);
|
||||
put_le16(p + 3, s->heads);
|
||||
put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
|
||||
put_le16(p + 5, 512); /* XXX: retired, remove ? */
|
||||
put_le16(p + 6, s->sectors);
|
||||
padstr((uint8_t *)(p + 10), "QM00001", 20); /* serial number */
|
||||
stw_raw(p + 20, 3); /* XXX: retired, remove ? */
|
||||
stw_raw(p + 21, 512); /* cache size in sectors */
|
||||
stw_raw(p + 22, 4); /* ecc bytes */
|
||||
put_le16(p + 20, 3); /* XXX: retired, remove ? */
|
||||
put_le16(p + 21, 512); /* cache size in sectors */
|
||||
put_le16(p + 22, 4); /* ecc bytes */
|
||||
padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */
|
||||
padstr((uint8_t *)(p + 27), "QEMU HARDDISK", 40); /* model */
|
||||
#if MAX_MULT_SECTORS > 1
|
||||
stw_raw(p + 47, 0x8000 | MAX_MULT_SECTORS);
|
||||
put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
|
||||
#endif
|
||||
stw_raw(p + 48, 1); /* dword I/O */
|
||||
stw_raw(p + 49, 1 << 9); /* LBA supported, no DMA */
|
||||
stw_raw(p + 51, 0x200); /* PIO transfer cycle */
|
||||
stw_raw(p + 52, 0x200); /* DMA transfer cycle */
|
||||
stw_raw(p + 53, 1); /* words 54-58 are valid */
|
||||
stw_raw(p + 54, s->cylinders);
|
||||
stw_raw(p + 55, s->heads);
|
||||
stw_raw(p + 56, s->sectors);
|
||||
put_le16(p + 48, 1); /* dword I/O */
|
||||
put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
|
||||
put_le16(p + 51, 0x200); /* PIO transfer cycle */
|
||||
put_le16(p + 52, 0x200); /* DMA transfer cycle */
|
||||
put_le16(p + 53, 1); /* words 54-58 are valid */
|
||||
put_le16(p + 54, s->cylinders);
|
||||
put_le16(p + 55, s->heads);
|
||||
put_le16(p + 56, s->sectors);
|
||||
oldsize = s->cylinders * s->heads * s->sectors;
|
||||
stw_raw(p + 57, oldsize);
|
||||
stw_raw(p + 58, oldsize >> 16);
|
||||
put_le16(p + 57, oldsize);
|
||||
put_le16(p + 58, oldsize >> 16);
|
||||
if (s->mult_sectors)
|
||||
stw_raw(p + 59, 0x100 | s->mult_sectors);
|
||||
stw_raw(p + 60, s->nb_sectors);
|
||||
stw_raw(p + 61, s->nb_sectors >> 16);
|
||||
stw_raw(p + 80, (1 << 1) | (1 << 2));
|
||||
stw_raw(p + 82, (1 << 14));
|
||||
stw_raw(p + 83, (1 << 14));
|
||||
stw_raw(p + 84, (1 << 14));
|
||||
stw_raw(p + 85, (1 << 14));
|
||||
stw_raw(p + 86, 0);
|
||||
stw_raw(p + 87, (1 << 14));
|
||||
put_le16(p + 59, 0x100 | s->mult_sectors);
|
||||
put_le16(p + 60, s->nb_sectors);
|
||||
put_le16(p + 61, s->nb_sectors >> 16);
|
||||
put_le16(p + 80, (1 << 1) | (1 << 2));
|
||||
put_le16(p + 82, (1 << 14));
|
||||
put_le16(p + 83, (1 << 14));
|
||||
put_le16(p + 84, (1 << 14));
|
||||
put_le16(p + 85, (1 << 14));
|
||||
put_le16(p + 86, 0);
|
||||
put_le16(p + 87, (1 << 14));
|
||||
}
|
||||
|
||||
static void ide_atapi_identify(IDEState *s)
|
||||
@ -428,32 +412,32 @@ static void ide_atapi_identify(IDEState *s)
|
||||
memset(s->io_buffer, 0, 512);
|
||||
p = (uint16_t *)s->io_buffer;
|
||||
/* Removable CDROM, 50us response, 12 byte packets */
|
||||
stw_raw(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
|
||||
stw_raw(p + 1, s->cylinders);
|
||||
stw_raw(p + 3, s->heads);
|
||||
stw_raw(p + 4, 512 * s->sectors); /* sectors */
|
||||
stw_raw(p + 5, 512); /* sector size */
|
||||
stw_raw(p + 6, s->sectors);
|
||||
put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
|
||||
put_le16(p + 1, s->cylinders);
|
||||
put_le16(p + 3, s->heads);
|
||||
put_le16(p + 4, 512 * s->sectors); /* sectors */
|
||||
put_le16(p + 5, 512); /* sector size */
|
||||
put_le16(p + 6, s->sectors);
|
||||
padstr((uint8_t *)(p + 10), "QM00001", 20); /* serial number */
|
||||
stw_raw(p + 20, 3); /* buffer type */
|
||||
stw_raw(p + 21, 512); /* cache size in sectors */
|
||||
stw_raw(p + 22, 4); /* ecc bytes */
|
||||
put_le16(p + 20, 3); /* buffer type */
|
||||
put_le16(p + 21, 512); /* cache size in sectors */
|
||||
put_le16(p + 22, 4); /* ecc bytes */
|
||||
padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */
|
||||
padstr((uint8_t *)(p + 27), "QEMU CD-ROM", 40); /* model */
|
||||
stw_raw(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
|
||||
stw_raw(p + 49, 1 << 9); /* LBA supported, no DMA */
|
||||
stw_raw(p + 53, 3); /* words 64-70, 54-58 valid */
|
||||
stw_raw(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
|
||||
stw_raw(p + 64, 1); /* PIO modes */
|
||||
stw_raw(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
|
||||
stw_raw(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
|
||||
stw_raw(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
|
||||
stw_raw(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
|
||||
put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
|
||||
put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
|
||||
put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
|
||||
put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
|
||||
put_le16(p + 64, 1); /* PIO modes */
|
||||
put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
|
||||
put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
|
||||
put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
|
||||
put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
|
||||
|
||||
stw_raw(p + 71, 30); /* in ns */
|
||||
stw_raw(p + 72, 30); /* in ns */
|
||||
put_le16(p + 71, 30); /* in ns */
|
||||
put_le16(p + 72, 30); /* in ns */
|
||||
|
||||
stw_raw(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
|
||||
put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
|
||||
}
|
||||
|
||||
static void ide_set_signature(IDEState *s)
|
||||
|
@ -21,26 +21,6 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <malloc.h>
|
||||
#include <termios.h>
|
||||
#include <sys/poll.h>
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "vl.h"
|
||||
|
||||
//#define DEBUG_CMOS
|
||||
|
20
hw/ne2000.c
20
hw/ne2000.c
@ -21,26 +21,6 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <malloc.h>
|
||||
#include <termios.h>
|
||||
#include <sys/poll.h>
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "vl.h"
|
||||
|
||||
/* debug NE2000 card */
|
||||
|
26
hw/pc.c
26
hw/pc.c
@ -21,26 +21,6 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <malloc.h>
|
||||
#include <termios.h>
|
||||
#include <sys/poll.h>
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "vl.h"
|
||||
|
||||
/* output Bochs bios info messages */
|
||||
@ -393,9 +373,13 @@ void pc_init(int ram_size, int vga_ram_size, int boot_device,
|
||||
bs_table[2 * i], bs_table[2 * i + 1]);
|
||||
}
|
||||
kbd_init();
|
||||
AUD_init();
|
||||
DMA_init();
|
||||
|
||||
#ifndef _WIN32
|
||||
/* no audio supported yet for win32 */
|
||||
AUD_init();
|
||||
SB16_init();
|
||||
#endif
|
||||
|
||||
floppy_controller = fdctrl_init(6, 2, 0, 0x3f0, fd_table);
|
||||
|
||||
|
20
hw/pckbd.c
20
hw/pckbd.c
@ -21,26 +21,6 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <malloc.h>
|
||||
#include <termios.h>
|
||||
#include <sys/poll.h>
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "vl.h"
|
||||
|
||||
/* debug PC keyboard */
|
||||
|
@ -21,11 +21,6 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "vl.h"
|
||||
|
||||
#define MIN(a, b) ((a)>(b)?(b):(a))
|
||||
|
20
hw/serial.c
20
hw/serial.c
@ -21,26 +21,6 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <malloc.h>
|
||||
#include <termios.h>
|
||||
#include <sys/poll.h>
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "vl.h"
|
||||
|
||||
//#define DEBUG_SERIAL
|
||||
|
22
hw/vga.c
22
hw/vga.c
@ -21,28 +21,6 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <malloc.h>
|
||||
#include <termios.h>
|
||||
#include <sys/poll.h>
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "exec-all.h"
|
||||
|
||||
#include "vl.h"
|
||||
|
||||
//#define DEBUG_VGA
|
||||
|
23
monitor.c
23
monitor.c
@ -21,25 +21,6 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <malloc.h>
|
||||
#include <termios.h>
|
||||
#include <sys/poll.h>
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "vl.h"
|
||||
|
||||
//#define DEBUG
|
||||
@ -311,6 +292,7 @@ static void do_cont(int argc, const char **argv)
|
||||
vm_start();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GDBSTUB
|
||||
static void do_gdbserver(int argc, const char **argv)
|
||||
{
|
||||
int port;
|
||||
@ -324,6 +306,7 @@ static void do_gdbserver(int argc, const char **argv)
|
||||
qemu_printf("Waiting gdb connection on port %d\n", port);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static term_cmd_t term_cmds[] = {
|
||||
{ "help|?", do_help,
|
||||
@ -348,7 +331,9 @@ static term_cmd_t term_cmds[] = {
|
||||
"filename", "restore the whole virtual machine state from 'filename'" },
|
||||
{ "stop", do_stop, "", "stop emulation", },
|
||||
{ "c|cont", do_cont, "", "resume emulation", },
|
||||
#ifdef CONFIG_GDBSTUB
|
||||
{ "gdbserver", do_gdbserver, "[port]", "start gdbserver session (default port=1234)", },
|
||||
#endif
|
||||
{ NULL, NULL, },
|
||||
};
|
||||
|
||||
|
5
osdep.c
5
osdep.c
@ -25,8 +25,6 @@
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
|
||||
@ -34,6 +32,9 @@
|
||||
|
||||
#if defined(__i386__) && !defined(CONFIG_SOFTMMU) && !defined(CONFIG_USER_ONLY)
|
||||
|
||||
#include <sys/mman.h>
|
||||
#include <sys/ipc.h>
|
||||
|
||||
/* When not using soft mmu, libc independant functions are needed for
|
||||
the CPU core because it needs to use alternates stacks and
|
||||
libc/thread incompatibles settings */
|
||||
|
44
oss.c
44
oss.c
@ -21,6 +21,9 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include "vl.h"
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
@ -33,7 +36,6 @@
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/soundcard.h>
|
||||
|
||||
#include "vl.h"
|
||||
|
||||
/* http://www.df.lth.se/~john_e/gems/gem002d.html */
|
||||
/* http://www.multi-platforms.com/Tips/PopCount.htm */
|
||||
@ -510,3 +512,43 @@ void AUD_init (void)
|
||||
|
||||
conf_fragsize = lsbindex (fsp);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void AUD_run (void)
|
||||
{
|
||||
}
|
||||
|
||||
int AUD_write (void *in_buf, int size)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void AUD_reset (int rfreq, int rnchannels, audfmt_e rfmt)
|
||||
{
|
||||
}
|
||||
|
||||
void AUD_adjust_estimate (int _leftover)
|
||||
{
|
||||
}
|
||||
|
||||
int AUD_get_free (void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int AUD_get_live (void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int AUD_get_buffer_size (void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void AUD_init (void)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -28,16 +28,11 @@
|
||||
#include <getopt.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <malloc.h>
|
||||
#include <termios.h>
|
||||
#include <sys/poll.h>
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/stat.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
|
29
sdl.c
29
sdl.c
@ -21,31 +21,13 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <malloc.h>
|
||||
#include <termios.h>
|
||||
#include <sys/poll.h>
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
#include <netinet/in.h>
|
||||
#include "vl.h"
|
||||
|
||||
#include <SDL.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "exec-all.h"
|
||||
|
||||
#include "vl.h"
|
||||
#ifndef _WIN32
|
||||
#include <signal.h>
|
||||
#endif
|
||||
|
||||
static SDL_Surface *screen;
|
||||
static int gui_grab; /* if true, all keyboard/mouse events are grabbed */
|
||||
@ -291,9 +273,12 @@ void sdl_display_init(DisplayState *ds)
|
||||
fprintf(stderr, "Could not initialize SDL - exiting\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
/* NOTE: we still want Ctrl-C to work, so we undo the SDL redirections */
|
||||
signal(SIGINT, SIG_DFL);
|
||||
signal(SIGQUIT, SIG_DFL);
|
||||
#endif
|
||||
|
||||
ds->dpy_update = sdl_update;
|
||||
ds->dpy_resize = sdl_resize;
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include <inttypes.h>
|
||||
#include <signal.h>
|
||||
#include <assert.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "exec-all.h"
|
||||
@ -334,7 +333,7 @@ int cpu_x86_handle_mmu_fault(CPUX86State *env, uint32_t addr,
|
||||
if (!(env->cr[0] & CR0_PG_MASK)) {
|
||||
pte = addr;
|
||||
virt_addr = addr & TARGET_PAGE_MASK;
|
||||
prot = PROT_READ | PROT_WRITE;
|
||||
prot = PAGE_READ | PAGE_WRITE;
|
||||
page_size = 4096;
|
||||
goto do_mapping;
|
||||
}
|
||||
@ -409,17 +408,17 @@ int cpu_x86_handle_mmu_fault(CPUX86State *env, uint32_t addr,
|
||||
}
|
||||
|
||||
/* the page can be put in the TLB */
|
||||
prot = PROT_READ;
|
||||
prot = PAGE_READ;
|
||||
if (pte & PG_DIRTY_MASK) {
|
||||
/* only set write access if already dirty... otherwise wait
|
||||
for dirty access */
|
||||
if (is_user) {
|
||||
if (ptep & PG_RW_MASK)
|
||||
prot |= PROT_WRITE;
|
||||
prot |= PAGE_WRITE;
|
||||
} else {
|
||||
if (!(env->cr[0] & CR0_WP_MASK) ||
|
||||
(ptep & PG_RW_MASK))
|
||||
prot |= PROT_WRITE;
|
||||
prot |= PAGE_WRITE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -17,15 +17,14 @@
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include "config.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
#include <signal.h>
|
||||
#include <assert.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/ucontext.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "exec-all.h"
|
||||
@ -33,6 +32,10 @@
|
||||
|
||||
#ifdef USE_CODE_COPY
|
||||
|
||||
#include <signal.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/ucontext.h>
|
||||
|
||||
extern char exec_loop;
|
||||
|
||||
/* operand size */
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include <inttypes.h>
|
||||
#include <signal.h>
|
||||
#include <assert.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "exec-all.h"
|
||||
|
185
vl.c
185
vl.c
@ -21,35 +21,40 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include "vl.h"
|
||||
|
||||
#include <getopt.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <malloc.h>
|
||||
#include <termios.h>
|
||||
#include <sys/poll.h>
|
||||
#include <errno.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <sys/times.h>
|
||||
#include <sys/wait.h>
|
||||
#include <pty.h>
|
||||
#include <sys/times.h>
|
||||
|
||||
#include <termios.h>
|
||||
#include <sys/poll.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/if_tun.h>
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <sys/timeb.h>
|
||||
#include <windows.h>
|
||||
#define getopt_long_only getopt_long
|
||||
#define memalign(align, size) malloc(size)
|
||||
#endif
|
||||
|
||||
|
||||
#include "disas.h"
|
||||
|
||||
#include "vl.h"
|
||||
#include "exec-all.h"
|
||||
|
||||
#define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup"
|
||||
@ -375,11 +380,17 @@ void cpu_disable_ticks(void)
|
||||
}
|
||||
}
|
||||
|
||||
int64_t get_clock(void)
|
||||
static int64_t get_clock(void)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
struct _timeb tb;
|
||||
_ftime(&tb);
|
||||
return ((int64_t)tb.time * 1000 + (int64_t)tb.millitm) * 1000;
|
||||
#else
|
||||
struct timeval tv;
|
||||
gettimeofday(&tv, NULL);
|
||||
return tv.tv_sec * 1000000LL + tv.tv_usec;
|
||||
#endif
|
||||
}
|
||||
|
||||
void cpu_calibrate_ticks(void)
|
||||
@ -388,7 +399,11 @@ void cpu_calibrate_ticks(void)
|
||||
|
||||
usec = get_clock();
|
||||
ticks = cpu_get_real_ticks();
|
||||
#ifdef _WIN32
|
||||
Sleep(50);
|
||||
#else
|
||||
usleep(50 * 1000);
|
||||
#endif
|
||||
usec = get_clock() - usec;
|
||||
ticks = cpu_get_real_ticks() - ticks;
|
||||
ticks_per_sec = (ticks * 1000000LL + (usec >> 1)) / usec;
|
||||
@ -438,8 +453,10 @@ QEMUClock *rt_clock;
|
||||
QEMUClock *vm_clock;
|
||||
|
||||
static QEMUTimer *active_timers[2];
|
||||
#ifndef _WIN32
|
||||
/* frequency of the times() clock tick */
|
||||
static int timer_freq;
|
||||
#endif
|
||||
|
||||
QEMUClock *qemu_new_clock(int type)
|
||||
{
|
||||
@ -550,12 +567,16 @@ int64_t qemu_get_clock(QEMUClock *clock)
|
||||
{
|
||||
switch(clock->type) {
|
||||
case QEMU_TIMER_REALTIME:
|
||||
#ifdef _WIN32
|
||||
return GetTickCount();
|
||||
#else
|
||||
/* XXX: portability among Linux hosts */
|
||||
if (timer_freq == 100) {
|
||||
return times(NULL) * 10;
|
||||
} else {
|
||||
return ((int64_t)times(NULL) * 1000) / timer_freq;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
case QEMU_TIMER_VIRTUAL:
|
||||
return cpu_get_ticks();
|
||||
@ -608,7 +629,12 @@ static int timer_load(QEMUFile *f, void *opaque, int version_id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
|
||||
DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
|
||||
#else
|
||||
static void host_alarm_handler(int host_signum)
|
||||
#endif
|
||||
{
|
||||
if (qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
|
||||
qemu_get_clock(vm_clock)) ||
|
||||
@ -621,39 +647,66 @@ static void host_alarm_handler(int host_signum)
|
||||
|
||||
static void init_timers(void)
|
||||
{
|
||||
struct sigaction act;
|
||||
struct itimerval itv;
|
||||
|
||||
/* get times() syscall frequency */
|
||||
timer_freq = sysconf(_SC_CLK_TCK);
|
||||
|
||||
rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME);
|
||||
vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL);
|
||||
|
||||
/* timer signal */
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_flags = 0;
|
||||
#ifdef _WIN32
|
||||
{
|
||||
int count=0;
|
||||
MMRESULT timerID = timeSetEvent(10, // interval (ms)
|
||||
0, // resolution
|
||||
host_alarm_handler, // function
|
||||
(DWORD)&count, // user parameter
|
||||
TIME_PERIODIC | TIME_CALLBACK_FUNCTION);
|
||||
if( !timerID ) {
|
||||
perror("failed timer alarm");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
pit_min_timer_count = ((uint64_t)10000 * PIT_FREQ) / 1000000;
|
||||
#else
|
||||
{
|
||||
struct sigaction act;
|
||||
struct itimerval itv;
|
||||
|
||||
/* get times() syscall frequency */
|
||||
timer_freq = sysconf(_SC_CLK_TCK);
|
||||
|
||||
/* timer signal */
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_flags = 0;
|
||||
#if defined (TARGET_I386) && defined(USE_CODE_COPY)
|
||||
act.sa_flags |= SA_ONSTACK;
|
||||
act.sa_flags |= SA_ONSTACK;
|
||||
#endif
|
||||
act.sa_handler = host_alarm_handler;
|
||||
sigaction(SIGALRM, &act, NULL);
|
||||
|
||||
itv.it_interval.tv_sec = 0;
|
||||
itv.it_interval.tv_usec = 1000;
|
||||
itv.it_value.tv_sec = 0;
|
||||
itv.it_value.tv_usec = 10 * 1000;
|
||||
setitimer(ITIMER_REAL, &itv, NULL);
|
||||
/* we probe the tick duration of the kernel to inform the user if
|
||||
the emulated kernel requested a too high timer frequency */
|
||||
getitimer(ITIMER_REAL, &itv);
|
||||
pit_min_timer_count = ((uint64_t)itv.it_interval.tv_usec * PIT_FREQ) /
|
||||
1000000;
|
||||
}
|
||||
#endif
|
||||
act.sa_handler = host_alarm_handler;
|
||||
sigaction(SIGALRM, &act, NULL);
|
||||
|
||||
itv.it_interval.tv_sec = 0;
|
||||
itv.it_interval.tv_usec = 1000;
|
||||
itv.it_value.tv_sec = 0;
|
||||
itv.it_value.tv_usec = 10 * 1000;
|
||||
setitimer(ITIMER_REAL, &itv, NULL);
|
||||
/* we probe the tick duration of the kernel to inform the user if
|
||||
the emulated kernel requested a too high timer frequency */
|
||||
getitimer(ITIMER_REAL, &itv);
|
||||
pit_min_timer_count = ((uint64_t)itv.it_interval.tv_usec * PIT_FREQ) /
|
||||
1000000;
|
||||
}
|
||||
|
||||
/***********************************************************/
|
||||
/* serial device */
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
int serial_open_device(void)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int serial_open_device(void)
|
||||
{
|
||||
char slave_name[1024];
|
||||
@ -672,9 +725,24 @@ int serial_open_device(void)
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/***********************************************************/
|
||||
/* Linux network device redirector */
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
static int net_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void net_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
|
||||
{
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static int tun_open(char *ifname, int ifname_size)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
@ -753,9 +821,23 @@ void net_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
|
||||
write(nd->fd, buf, size);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/***********************************************************/
|
||||
/* dumb display */
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
static void term_exit(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void term_init(void)
|
||||
{
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/* init terminal so that we can grab keys */
|
||||
static struct termios oldtty;
|
||||
|
||||
@ -790,6 +872,8 @@ static void term_init(void)
|
||||
fcntl(0, F_SETFL, O_NONBLOCK);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static void dumb_update(DisplayState *ds, int x, int y, int w, int h)
|
||||
{
|
||||
}
|
||||
@ -1396,10 +1480,13 @@ void vm_stop(int reason)
|
||||
|
||||
int main_loop(void)
|
||||
{
|
||||
#ifndef _WIN32
|
||||
struct pollfd ufds[MAX_IO_HANDLERS + 1], *pf;
|
||||
int ret, n, timeout, max_size;
|
||||
uint8_t buf[4096];
|
||||
IOHandlerRecord *ioh, *ioh_next;
|
||||
uint8_t buf[4096];
|
||||
int n, max_size;
|
||||
#endif
|
||||
int ret, timeout;
|
||||
CPUState *env = global_env;
|
||||
|
||||
for(;;) {
|
||||
@ -1422,6 +1509,7 @@ int main_loop(void)
|
||||
timeout = 10;
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
/* poll any events */
|
||||
/* XXX: separate device handlers from system ones */
|
||||
pf = ufds;
|
||||
@ -1471,6 +1559,7 @@ int main_loop(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (vm_running) {
|
||||
qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
|
||||
@ -1592,7 +1681,10 @@ static uint8_t *signal_stack;
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int c, i, use_gdbstub, gdbstub_port, long_index, has_cdrom;
|
||||
#ifdef CONFIG_GDBSTUB
|
||||
int use_gdbstub, gdbstub_port;
|
||||
#endif
|
||||
int c, i, long_index, has_cdrom;
|
||||
int snapshot, linux_boot;
|
||||
CPUState *env;
|
||||
const char *initrd_filename;
|
||||
@ -1601,8 +1693,10 @@ int main(int argc, char **argv)
|
||||
DisplayState *ds = &display_state;
|
||||
int cyls, heads, secs;
|
||||
|
||||
#if !defined(CONFIG_SOFTMMU)
|
||||
/* we never want that malloc() uses mmap() */
|
||||
mallopt(M_MMAP_THRESHOLD, 4096 * 1024);
|
||||
#endif
|
||||
initrd_filename = NULL;
|
||||
for(i = 0; i < MAX_FD; i++)
|
||||
fd_filename[i] = NULL;
|
||||
@ -1611,8 +1705,10 @@ int main(int argc, char **argv)
|
||||
ram_size = 32 * 1024 * 1024;
|
||||
vga_ram_size = VGA_RAM_SIZE;
|
||||
pstrcpy(network_script, sizeof(network_script), DEFAULT_NETWORK_SCRIPT);
|
||||
#ifdef CONFIG_GDBSTUB
|
||||
use_gdbstub = 0;
|
||||
gdbstub_port = DEFAULT_GDBSTUB_PORT;
|
||||
#endif
|
||||
snapshot = 0;
|
||||
nographic = 0;
|
||||
kernel_filename = NULL;
|
||||
@ -1773,12 +1869,14 @@ int main(int argc, char **argv)
|
||||
case 'n':
|
||||
pstrcpy(network_script, sizeof(network_script), optarg);
|
||||
break;
|
||||
#ifdef CONFIG_GDBSTUB
|
||||
case 's':
|
||||
use_gdbstub = 1;
|
||||
break;
|
||||
case 'p':
|
||||
gdbstub_port = atoi(optarg);
|
||||
break;
|
||||
#endif
|
||||
case 'L':
|
||||
bios_dir = optarg;
|
||||
break;
|
||||
@ -1976,6 +2074,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32
|
||||
{
|
||||
struct sigaction act;
|
||||
sigfillset(&act.sa_mask);
|
||||
@ -1983,10 +2082,12 @@ int main(int argc, char **argv)
|
||||
act.sa_handler = SIG_IGN;
|
||||
sigaction(SIGPIPE, &act, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
gui_timer = qemu_new_timer(rt_clock, gui_update, NULL);
|
||||
qemu_mod_timer(gui_timer, qemu_get_clock(rt_clock));
|
||||
|
||||
#ifdef CONFIG_GDBSTUB
|
||||
if (use_gdbstub) {
|
||||
if (gdbserver_start(gdbstub_port) < 0) {
|
||||
fprintf(stderr, "Could not open gdbserver socket on port %d\n",
|
||||
@ -1995,7 +2096,9 @@ int main(int argc, char **argv)
|
||||
} else {
|
||||
printf("Waiting gdb connection on port %d\n", gdbstub_port);
|
||||
}
|
||||
} else {
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
vm_start();
|
||||
}
|
||||
term_init();
|
||||
|
69
vl.h
69
vl.h
@ -24,10 +24,79 @@
|
||||
#ifndef VL_H
|
||||
#define VL_H
|
||||
|
||||
/* we put basic includes here to avoid repeating them in device drivers */
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
#include <time.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#ifndef O_LARGEFILE
|
||||
#define O_LARGEFILE 0
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#define lseek64 lseek
|
||||
#endif
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
#ifndef glue
|
||||
#define xglue(x, y) x ## y
|
||||
#define glue(x, y) xglue(x, y)
|
||||
#define stringify(s) tostring(s)
|
||||
#define tostring(s) #s
|
||||
#endif
|
||||
|
||||
#if defined(WORDS_BIGENDIAN)
|
||||
static inline uint32_t be32_to_cpu(uint32_t v)
|
||||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
static inline uint16_t be16_to_cpu(uint16_t v)
|
||||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
static inline uint32_t le32_to_cpu(uint32_t v)
|
||||
{
|
||||
return bswap32(v);
|
||||
}
|
||||
|
||||
static inline uint16_t le16_to_cpu(uint16_t v)
|
||||
{
|
||||
return bswap16(v);
|
||||
}
|
||||
|
||||
#else
|
||||
static inline uint32_t be32_to_cpu(uint32_t v)
|
||||
{
|
||||
return bswap32(v);
|
||||
}
|
||||
|
||||
static inline uint16_t be16_to_cpu(uint16_t v)
|
||||
{
|
||||
return bswap16(v);
|
||||
}
|
||||
|
||||
static inline uint32_t le32_to_cpu(uint32_t v)
|
||||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
static inline uint16_t le16_to_cpu(uint16_t v)
|
||||
{
|
||||
return v;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* vl.c */
|
||||
extern int reset_requested;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user