From: Ulrich Hecht <uli@suse.de>
To: fabrice@bellard.org, paul@nowt.org
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] Patch day
Date: Wed, 8 Mar 2006 17:57:43 +0100 [thread overview]
Message-ID: <200603081757.43835.uli@suse.de> (raw)
[-- Attachment #1: Type: text/plain, Size: 923 bytes --]
Hi!
Here's the current lot of patches from the SuSE QEMU package. As we have
now arrived at the point where patches start to conflict with each
other, I would be very grateful if at least some of these went into the
next release.
qemu-0.7.0-binfmt.patch: some enhancements to the qemu-binfmt-conf.sh
script
qemu-0.7.1-armfpaex.patch: proper FPA exception generation for arm-user
targets
qemu-0.7.1-jobsignals.patch: handle SIGTTOU/SIGTTIN/SIGTSTP; makes job
control work
qemu-0.7.1-syscalls.patch: implements acct, uselib, syslog, mincore,
madvise, readahead, clock_gettime; I have not extensively checked these
for correctness, but from experience I can say that with this patch
applied a lot of breakage vanishes
qemu-0.8.0-ia64.patch: Itanium host fixes by Andreas Schwab
qemu-nwfpe-cpsr.patch: fixes ARM FPA CPSR updates; same as posted before,
but fixed to work with qemu-0.7.1-armfpaex.patch
CU
Uli
[-- Attachment #2: qemu-0.7.0-binfmt.patch --]
[-- Type: text/x-diff, Size: 4630 bytes --]
--- qemu-binfmt-conf.sh
+++ qemu-binfmt-conf.sh
@@ -2,38 +2,46 @@
# enable automatic i386/ARM/SPARC/PPC program execution by the kernel
# load the binfmt_misc module
-/sbin/modprobe binfmt_misc
+
+if test ! -e /proc/sys/fs/binfmt_misc/register
+then
+ /sbin/modprobe binfmt_misc
+ mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
+fi
# probe cpu type
cpu=`uname -m`
case "$cpu" in
- i386|i486|i586|i686|i86pc|BePC)
+ i386|i486|i586|i686|i86pc|BePC|x86_64)
cpu="i386"
;;
"Power Macintosh"|ppc|ppc64)
cpu="ppc"
;;
- armv4l)
+ armv[4-9]*l)
cpu="arm"
;;
+ sparc*)
+ cpu="sparc"
+ ;;
esac
# register the interpreter for each cpu except for the native one
if [ $cpu != "i386" ] ; then
- echo ':i386:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-i386:' > /proc/sys/fs/binfmt_misc/register
- echo ':i486:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-i386:' > /proc/sys/fs/binfmt_misc/register
+ echo ':i386:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-i386:' > /proc/sys/fs/binfmt_misc/register
+ echo ':i486:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-i386:' > /proc/sys/fs/binfmt_misc/register
fi
if [ $cpu != "arm" ] ; then
- echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-arm:' > /proc/sys/fs/binfmt_misc/register
- echo ':armeb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-armeb:' > /proc/sys/fs/binfmt_misc/register
+ echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm:' > /proc/sys/fs/binfmt_misc/register
+ echo ':armeb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-armeb:' > /proc/sys/fs/binfmt_misc/register
fi
if [ $cpu != "sparc" ] ; then
- echo ':sparc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-sparc:' > /proc/sys/fs/binfmt_misc/register
+ echo ':sparc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sparc:' > /proc/sys/fs/binfmt_misc/register
fi
if [ $cpu != "ppc" ] ; then
- echo ':ppc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-ppc:' > /proc/sys/fs/binfmt_misc/register
+ echo ':ppc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-ppc:' > /proc/sys/fs/binfmt_misc/register
fi
if [ $cpu != "mips" ] ; then
- echo ':mips:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-mips:' > /proc/sys/fs/binfmt_misc/register
- echo ':mipsel:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-mipsel:' > /proc/sys/fs/binfmt_misc/register
+ echo ':mips:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips:' > /proc/sys/fs/binfmt_misc/register
+ echo ':mipsel:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mipsel:' > /proc/sys/fs/binfmt_misc/register
fi
[-- Attachment #3: qemu-0.7.1-armfpaex.patch --]
[-- Type: text/x-diff, Size: 3572 bytes --]
--- linux-user/main.c
+++ linux-user/main.c
@@ -339,18 +339,54 @@
{
TaskState *ts = env->opaque;
uint32_t opcode;
+ int rc;
/* we handle the FPU emulation here, as Linux */
/* we get the opcode */
opcode = ldl_raw((uint8_t *)env->regs[15]);
- if (EmulateAll(opcode, &ts->fpa, env->regs) == 0) {
+ if ((rc=EmulateAll(opcode, &ts->fpa, env->regs)) == 0) { /* illegal instruction */
info.si_signo = SIGILL;
info.si_errno = 0;
info.si_code = TARGET_ILL_ILLOPN;
info._sifields._sigfault._addr = env->regs[15];
queue_signal(info.si_signo, &info);
- } else {
+ } else if (rc < 0) { /* FP exception */
+ int arm_fpe=0;
+ /* translate softfloat flags to FPSR flags */
+ if(-rc & float_flag_invalid) arm_fpe |= BIT_IOC;
+ if(-rc & float_flag_divbyzero) arm_fpe |= BIT_DZC;
+ if(-rc & float_flag_overflow) arm_fpe |= BIT_OFC;
+ if(-rc & float_flag_underflow) arm_fpe |= BIT_UFC;
+ if(-rc & float_flag_inexact) arm_fpe |= BIT_IXC;
+
+ FPSR fpsr = ts->fpa.fpsr;
+ //printf("fpsr 0x%x, arm_fpe 0x%x\n",fpsr,arm_fpe);
+
+ if(fpsr & (arm_fpe << 16)) /* exception enabled? */
+ {
+ info.si_signo = SIGFPE;
+ info.si_errno = 0;
+ /* ordered by priority, least first */
+ if(arm_fpe & BIT_IXC) info.si_code = TARGET_FPE_FLTRES;
+ if(arm_fpe & BIT_UFC) info.si_code = TARGET_FPE_FLTUND;
+ if(arm_fpe & BIT_OFC) info.si_code = TARGET_FPE_FLTOVF;
+ if(arm_fpe & BIT_DZC) info.si_code = TARGET_FPE_FLTDIV;
+ if(arm_fpe & BIT_IOC) info.si_code = TARGET_FPE_FLTINV;
+ info._sifields._sigfault._addr = env->regs[15];
+ queue_signal(info.si_signo, &info);
+ }
+ else
+ env->regs[15] += 4;
+
+ /* accumulate unenabled exceptions */
+ if((!(fpsr & BIT_IXE)) && (arm_fpe & BIT_IXC)) fpsr |= BIT_IXC;
+ if((!(fpsr & BIT_UFE)) && (arm_fpe & BIT_UFC)) fpsr |= BIT_UFC;
+ if((!(fpsr & BIT_OFE)) && (arm_fpe & BIT_OFC)) fpsr |= BIT_OFC;
+ if((!(fpsr & BIT_DZE)) && (arm_fpe & BIT_DZC)) fpsr |= BIT_DZC;
+ if((!(fpsr & BIT_IOE)) && (arm_fpe & BIT_IOC)) fpsr |= BIT_IOC;
+ ts->fpa.fpsr=fpsr;
+ } else { /* everything OK */
/* increment PC */
env->regs[15] += 4;
}
--- target-arm/nwfpe/fpa11.c
+++ target-arm/nwfpe/fpa11.c
@@ -161,6 +161,8 @@
fpa11->initflag = 1;
}
+ set_float_exception_flags(0, &fpa11->fp_status);
+
if (TEST_OPCODE(opcode,MASK_CPRT))
{
//fprintf(stderr,"emulating CPRT\n");
@@ -190,6 +192,11 @@
}
// restore_flags(flags);
+ if(nRc == 1 && get_float_exception_flags(&fpa11->fp_status))
+ {
+ //printf("fef 0x%x\n",float_exception_flags);
+ nRc=-get_float_exception_flags(&fpa11->fp_status);
+ }
//printf("returning %d\n",nRc);
return(nRc);
[-- Attachment #4: qemu-0.7.1-jobsignals.patch --]
[-- Type: text/x-diff, Size: 698 bytes --]
--- linux-user/signal.c
+++ linux-user/signal.c
@@ -341,10 +341,15 @@
k = &sigact_table[sig - 1];
handler = k->sa._sa_handler;
if (handler == TARGET_SIG_DFL) {
+ if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
+ kill(getpid(),SIGSTOP);
+ return 0;
+ } else
/* default handler : ignore some signal. The other are fatal */
if (sig != TARGET_SIGCHLD &&
sig != TARGET_SIGURG &&
- sig != TARGET_SIGWINCH) {
+ sig != TARGET_SIGWINCH &&
+ sig != TARGET_SIGCONT) {
force_sig(sig);
} else {
return 0; /* indicate ignored */
[-- Attachment #5: qemu-0.7.1-syscalls.patch --]
[-- Type: text/x-diff, Size: 3856 bytes --]
--- linux-user/arm/syscall_nr.h
+++ linux-user/arm/syscall_nr.h
@@ -259,4 +259,5 @@
/* 254 for set_thread_area */
/* 255 for get_thread_area */
/* 256 for set_tid_address */
+#define TARGET_NR_clock_gettime (263)
#define TARGET_NR_utimes (269)
--- linux-user/syscall.c
+++ linux-user/syscall.c
@@ -207,6 +207,7 @@
#define __NR_sys_getdents __NR_getdents
#define __NR_sys_getdents64 __NR_getdents64
#define __NR_sys_rt_sigqueueinfo __NR_rt_sigqueueinfo
+#define __NR_sys_syslog __NR_syslog
#if defined(__alpha__) || defined (__ia64__) || defined(__x86_64__)
#define __NR__llseek __NR_lseek
@@ -228,6 +229,7 @@
_syscall2(int,sys_statfs,const char *,path,struct kernel_statfs *,buf)
_syscall2(int,sys_fstatfs,int,fd,struct kernel_statfs *,buf)
_syscall3(int,sys_rt_sigqueueinfo,int,pid,int,sig,siginfo_t *,uinfo)
+_syscall3(int,sys_syslog,int,type,char*,bufp,int,len)
#ifdef __NR_exit_group
_syscall1(int,exit_group,int,error_code)
#endif
@@ -241,6 +243,7 @@
extern int setresgid(gid_t, gid_t, gid_t);
extern int getresgid(gid_t *, gid_t *, gid_t *);
extern int setgroups(int, gid_t *);
+extern int uselib(const char*);
static inline long get_errno(long ret)
{
@@ -1895,7 +1898,9 @@
goto unimplemented;
case TARGET_NR_acct:
- goto unimplemented;
+ ret = get_errno(acct(path((const char*)arg1)));
+ break;
+
case TARGET_NR_umount2:
ret = get_errno(umount2((const char *)arg1, arg2));
break;
@@ -2207,7 +2212,9 @@
ret = get_errno(readlink(path((const char *)arg1), (char *)arg2, arg3));
break;
case TARGET_NR_uselib:
- goto unimplemented;
+ ret = get_errno(uselib(path((const char*)arg1)));
+ break;
+
case TARGET_NR_swapon:
ret = get_errno(swapon((const char *)arg1, arg2));
break;
@@ -2322,7 +2329,9 @@
ret = do_socketcall(arg1, (int32_t *)arg2);
break;
case TARGET_NR_syslog:
- goto unimplemented;
+ ret = get_errno(sys_syslog((int)arg1, (char*)arg2, (int)arg3));
+ break;
+
case TARGET_NR_setitimer:
{
struct target_itimerval *target_value = (void *)arg2;
@@ -3116,11 +3125,14 @@
goto unimplemented;
#ifdef TARGET_NR_mincore
case TARGET_NR_mincore:
- goto unimplemented;
+ page_unprotect_range((void*)arg3, ((size_t)arg2 + TARGET_PAGE_SIZE - 1) / TARGET_PAGE_SIZE);
+ ret = get_errno(mincore((void*)arg1, (size_t)arg2, (unsigned char*)arg3));
+ break;
#endif
#ifdef TARGET_NR_madvise
case TARGET_NR_madvise:
- goto unimplemented;
+ ret = get_errno(madvise((void*)arg1, (size_t)arg2, (int)arg3));
+ break;
#endif
#if TARGET_LONG_BITS == 32
case TARGET_NR_fcntl64:
@@ -3169,7 +3181,8 @@
ret = get_errno(gettid());
break;
case TARGET_NR_readahead:
- goto unimplemented;
+ ret = get_errno(readahead((int)arg1, (off64_t)arg2, (size_t)arg3));
+ break;
#ifdef TARGET_NR_setxattr
case TARGET_NR_setxattr:
case TARGET_NR_lsetxattr:
@@ -3190,6 +3203,22 @@
case TARGET_NR_get_thread_area:
goto unimplemented_nowarn;
#endif
+#ifdef TARGET_NR_clock_gettime
+ case TARGET_NR_clock_gettime:
+ {
+ struct target_timespec* ttp = (struct target_timespec*)arg2;
+ struct timespec htp;
+ if(ttp) {
+ htp.tv_sec = tswapl(ttp->tv_sec);
+ htp.tv_nsec = tswapl(ttp->tv_nsec);
+ ret = get_errno(clock_gettime((clockid_t)arg1, &htp));
+ ttp->tv_sec = tswapl(htp.tv_sec);
+ ttp->tv_nsec = tswapl(htp.tv_nsec);
+ } else
+ ret = get_errno(clock_gettime((clockid_t)arg1, NULL));
+ break;
+ }
+#endif
default:
unimplemented:
gemu_log("qemu: Unsupported syscall: %d\n", num);
[-- Attachment #6: qemu-0.8.0-ia64.patch --]
[-- Type: text/x-diff, Size: 3702 bytes --]
---
Makefile.target | 3 ---
cpu-exec.c | 3 +--
dyngen.c | 6 ++++--
dyngen.h | 3 +++
linux-user/syscall.c | 2 +-
target-mips/exec.h | 4 ++++
6 files changed, 13 insertions(+), 8 deletions(-)
Index: Makefile.target
===================================================================
--- Makefile.target.orig 2006-03-07 02:12:48.000000000 +0100
+++ Makefile.target 2006-03-07 02:12:48.000000000 +0100
@@ -252,9 +252,6 @@ ifeq ($(findstring m68k, $(TARGET_ARCH)
LIBOBJS+=m68k-dis.o
endif
-ifeq ($(ARCH),ia64)
-OBJS += ia64-syscall.o
-endif
ifdef CONFIG_GDBSTUB
OBJS+=gdbstub.o
endif
Index: cpu-exec.c
===================================================================
--- cpu-exec.c.orig 2005-12-19 23:51:53.000000000 +0100
+++ cpu-exec.c 2006-03-07 02:12:48.000000000 +0100
@@ -1351,7 +1351,6 @@ int cpu_signal_handler(int host_signum,
#ifndef __ISR_VALID
/* This ought to be in <bits/siginfo.h>... */
# define __ISR_VALID 1
-# define si_flags _sifields._sigfault._si_pad0
#endif
int cpu_signal_handler(int host_signum, struct siginfo *info, void *puc)
@@ -1367,7 +1366,7 @@ int cpu_signal_handler(int host_signum,
case SIGSEGV:
case SIGBUS:
case SIGTRAP:
- if (info->si_code && (info->si_flags & __ISR_VALID))
+ if (info->si_code && (info->si_segvflags & __ISR_VALID))
/* ISR.W (write-access) is bit 33: */
is_write = (info->si_isr >> 33) & 1;
break;
Index: dyngen.c
===================================================================
--- dyngen.c.orig 2005-12-19 23:51:53.000000000 +0100
+++ dyngen.c 2006-03-07 02:14:36.000000000 +0100
@@ -2469,10 +2469,12 @@ fprintf(outfile,
);
#ifdef HOST_IA64
fprintf(outfile,
- " ia64_apply_fixes(&gen_code_ptr, ltoff_fixes, "
+ " {\n"
+ " extern char code_gen_buffer[];\n"
+ " ia64_apply_fixes(&gen_code_ptr, ltoff_fixes, "
"(uint64_t) code_gen_buffer + 2*(1<<20), plt_fixes,\n\t\t\t"
"sizeof(plt_target)/sizeof(plt_target[0]),\n\t\t\t"
- "plt_target, plt_offset);\n");
+ "plt_target, plt_offset);\n }\n");
#endif
/* generate some code patching */
Index: dyngen.h
===================================================================
--- dyngen.h.orig 2005-12-19 23:51:53.000000000 +0100
+++ dyngen.h 2006-03-07 02:12:48.000000000 +0100
@@ -420,6 +420,9 @@ static inline void ia64_apply_fixes (uin
}
ia64_imm22(fixup->addr, (long) vp - gp);
}
+ /* Keep code ptr aligned. */
+ if ((long) gen_code_ptr & 15)
+ gen_code_ptr += 8;
*gen_code_pp = gen_code_ptr;
}
Index: linux-user/syscall.c
===================================================================
--- linux-user/syscall.c.orig 2006-03-07 02:12:48.000000000 +0100
+++ linux-user/syscall.c 2006-03-07 02:12:48.000000000 +0100
@@ -1513,7 +1513,7 @@ int do_fork(CPUState *env, unsigned int
#endif
new_env->opaque = ts;
#ifdef __ia64__
- ret = clone2(clone_func, new_stack + NEW_STACK_SIZE, flags, new_env);
+ ret = __clone2(clone_func, new_stack + NEW_STACK_SIZE, flags, new_env);
#else
ret = clone(clone_func, new_stack + NEW_STACK_SIZE, flags, new_env);
#endif
Index: target-mips/exec.h
===================================================================
--- target-mips/exec.h.orig 2005-12-19 23:51:53.000000000 +0100
+++ target-mips/exec.h 2006-03-07 02:12:48.000000000 +0100
@@ -31,7 +31,11 @@ register double FT2 asm(FREG2);
#endif
#if defined (DEBUG_OP)
+#if defined (__ia64__)
+#define RETURN() __asm__ __volatile__("nop 0");
+#else
#define RETURN() __asm__ __volatile__("nop");
+#endif
#else
#define RETURN() __asm__ __volatile__("");
#endif
[-- Attachment #7: qemu-nwfpe-cpsr.patch --]
[-- Type: text/x-diff, Size: 3050 bytes --]
--- qemu-0.8.0/linux-user/main.c
+++ qemu-0.8.0/linux-user/main.c
@@ -346,7 +346,7 @@
/* we get the opcode */
opcode = ldl_raw((uint8_t *)env->regs[15]);
- if ((rc=EmulateAll(opcode, &ts->fpa, env->regs)) == 0) { /* illegal instruction */
+ if ((rc=EmulateAll(opcode, &ts->fpa, env)) == 0) { /* illegal instruction */
info.si_signo = SIGILL;
info.si_errno = 0;
info.si_code = TARGET_ILL_ILLOPN;
--- qemu-0.8.0/target-arm/nwfpe/fpa11.c
+++ qemu-0.8.0/target-arm/nwfpe/fpa11.c
@@ -36,7 +36,7 @@
unsigned int EmulateCPRT(const unsigned int);
FPA11* qemufpa=0;
-unsigned int* user_registers=0;
+CPUARMState* user_registers=0;
/* Reset the FPA11 chip. Called to initialize and reset the emulator. */
void resetFPA11(void)
@@ -137,7 +137,7 @@
}
/* Emulate the instruction in the opcode. */
-unsigned int EmulateAll(unsigned int opcode, FPA11* qfpa, unsigned int* qregs)
+unsigned int EmulateAll(unsigned int opcode, FPA11* qfpa, CPUARMState* qregs)
{
unsigned int nRc = 0;
// unsigned long flags;
--- qemu-0.8.0/target-arm/nwfpe/fpa11.h
+++ qemu-0.8.0/target-arm/nwfpe/fpa11.h
@@ -26,6 +26,8 @@
#include <stdio.h>
#include <errno.h>
+#include <cpu.h>
+
#define GET_FPA11() (qemufpa)
/*
@@ -33,7 +35,7 @@
* stack+task struct. Use the same method as 'current' uses to
* reach them.
*/
-extern unsigned int *user_registers;
+extern CPUARMState *user_registers;
#define GET_USERREG() (user_registers)
@@ -94,7 +96,7 @@
static inline unsigned int readRegister(unsigned int reg)
{
- return (user_registers[(reg)]);
+ return (user_registers->regs[(reg)]);
}
static inline void writeRegister(unsigned int x, unsigned int y)
@@ -102,34 +104,17 @@
#if 0
printf("writing %d to r%d\n",y,x);
#endif
- user_registers[(x)]=(y);
+ user_registers->regs[(x)]=(y);
}
static inline void writeConditionCodes(unsigned int x)
{
-#if 0
-unsigned int y;
-unsigned int ZF;
- printf("setting flags to %x from %x\n",x,user_registers[16]);
-#endif
- user_registers[16]=(x); // cpsr
- user_registers[17]=(x>>29)&1; // cf
- user_registers[18]=(x<<3)&(1<<31); // vf
- user_registers[19]=x&(1<<31); // nzf
- if(!(x&(1<<30))) user_registers[19]++; // nzf must be non-zero for zf to be cleared
-
-#if 0
- ZF = (user_registers[19] == 0);
- y=user_registers[16] | (user_registers[19] & 0x80000000) | (ZF << 30) |
- (user_registers[17] << 29) | ((user_registers[18] & 0x80000000) >> 3);
- if(y != x)
- printf("GODDAM SHIIIIIIIIIIIIIIIIT! %x %x nzf %x zf %x\n",x,y,user_registers[19],ZF);
-#endif
+ cpsr_write(user_registers,x,~CPSR_M);
}
#define REG_PC 15
-unsigned int EmulateAll(unsigned int opcode, FPA11* qfpa, unsigned int* qregs);
+unsigned int EmulateAll(unsigned int opcode, FPA11* qfpa, CPUARMState* qregs);
/* included only for get_user/put_user macros */
#include "qemu.h"
reply other threads:[~2006-03-08 16:57 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200603081757.43835.uli@suse.de \
--to=uli@suse.de \
--cc=fabrice@bellard.org \
--cc=paul@nowt.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).