提交 ae228531 编写于 作者: B bellard

Sparc update (David S. Miller)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@161 c046a42c-6fe2-441c-8c8c-71466251a162
上级 d418c81e
...@@ -29,6 +29,18 @@ OP_CFLAGS=$(CFLAGS) ...@@ -29,6 +29,18 @@ OP_CFLAGS=$(CFLAGS)
LDFLAGS+=-Wl,-T,s390.ld LDFLAGS+=-Wl,-T,s390.ld
endif endif
ifeq ($(ARCH),sparc)
CFLAGS+=-m32 -ffixed-g1 -ffixed-g2 -ffixed-g3 -ffixed-g6
LDFLAGS+=-m32
OP_CFLAGS=$(CFLAGS) -fno-delayed-branch -ffixed-i0
endif
ifeq ($(ARCH),sparc64)
CFLAGS+=-m64 -ffixed-g1 -ffixed-g2 -ffixed-g3 -ffixed-g6
LDFLAGS+=-m64
OP_CFLAGS=$(CFLAGS) -fno-delayed-branch -ffixed-i0
endif
ifeq ($(ARCH),alpha) ifeq ($(ARCH),alpha)
# -msmall-data is not used because we want two-instruction relocations # -msmall-data is not used because we want two-instruction relocations
# for the constant constructions # for the constant constructions
......
...@@ -47,6 +47,12 @@ case "$cpu" in ...@@ -47,6 +47,12 @@ case "$cpu" in
s390) s390)
cpu="s390" cpu="s390"
;; ;;
sparc)
cpu="sparc"
;;
sparc64)
cpu="sparc64"
;;
ia64) ia64)
cpu="ia64" cpu="ia64"
;; ;;
...@@ -131,7 +137,7 @@ fi ...@@ -131,7 +137,7 @@ fi
else else
# if cross compiling, cannot launch a program, so make a static guess # if cross compiling, cannot launch a program, so make a static guess
if test "$cpu" = "powerpc" -o "$cpu" = "mips" -o "$cpu" = "s390" ; then if test "$cpu" = "powerpc" -o "$cpu" = "mips" -o "$cpu" = "s390" -o "$cpu" = "sparc" -o "$cpu" = "sparc64"; then
bigendian="yes" bigendian="yes"
fi fi
...@@ -217,6 +223,12 @@ elif test "$cpu" = "s390" ; then ...@@ -217,6 +223,12 @@ elif test "$cpu" = "s390" ; then
elif test "$cpu" = "alpha" ; then elif test "$cpu" = "alpha" ; then
echo "ARCH=alpha" >> config.mak echo "ARCH=alpha" >> config.mak
echo "#define HOST_ALPHA 1" >> $TMPH echo "#define HOST_ALPHA 1" >> $TMPH
elif test "$cpu" = "sparc" ; then
echo "ARCH=sparc" >> config.mak
echo "#define HOST_SPARC 1" >> $TMPH
elif test "$cpu" = "sparc64" ; then
echo "ARCH=sparc64" >> config.mak
echo "#define HOST_SPARC64 1" >> $TMPH
elif test "$cpu" = "ia64" ; then elif test "$cpu" = "ia64" ; then
echo "ARCH=ia64" >> config.mak echo "ARCH=ia64" >> config.mak
echo "#define HOST_IA64 1" >> $TMPH echo "#define HOST_IA64 1" >> $TMPH
......
此差异已折叠。
...@@ -153,6 +153,13 @@ void raise_exception_err(int exception_index, int error_code) ...@@ -153,6 +153,13 @@ void raise_exception_err(int exception_index, int error_code)
{ {
/* NOTE: the register at this point must be saved by hand because /* NOTE: the register at this point must be saved by hand because
longjmp restore them */ longjmp restore them */
#ifdef __sparc__
/* We have to stay in the same register window as our caller,
* thus this trick.
*/
__asm__ __volatile__("restore\n\t"
"mov\t%o0, %i0");
#endif
#ifdef reg_EAX #ifdef reg_EAX
env->regs[R_EAX] = EAX; env->regs[R_EAX] = EAX;
#endif #endif
...@@ -409,7 +416,15 @@ int cpu_x86_exec(CPUX86State *env1) ...@@ -409,7 +416,15 @@ int cpu_x86_exec(CPUX86State *env1)
/* execute the generated code */ /* execute the generated code */
tc_ptr = tb->tc_ptr; tc_ptr = tb->tc_ptr;
gen_func = (void *)tc_ptr; gen_func = (void *)tc_ptr;
#ifdef __sparc__
__asm__ __volatile__("call %0\n\t"
" mov %%o7,%%i0"
: /* no outputs */
: "r" (gen_func)
: "i0", "i1", "i2", "i3", "i4", "i5");
#else
gen_func(); gen_func();
#endif
} }
} }
ret = env->exception_index; ret = env->exception_index;
......
...@@ -89,11 +89,27 @@ register unsigned int A0 asm("s2"); ...@@ -89,11 +89,27 @@ register unsigned int A0 asm("s2");
register struct CPUX86State *env asm("s3"); register struct CPUX86State *env asm("s3");
#endif #endif
#ifdef __sparc__ #ifdef __sparc__
register unsigned int T0 asm("l0"); register unsigned int EAX asm("l0");
register unsigned int T1 asm("l1"); register unsigned int ECX asm("l1");
register unsigned int A0 asm("l2"); register unsigned int EDX asm("l2");
register struct CPUX86State *env asm("l3"); register unsigned int EBX asm("l3");
register unsigned int ESP asm("l4");
register unsigned int EBP asm("l5");
register unsigned int ESI asm("l6");
register unsigned int EDI asm("l7");
register unsigned int T0 asm("g1");
register unsigned int T1 asm("g2");
register unsigned int A0 asm("g3");
register struct CPUX86State *env asm("g6");
#define USE_FP_CONVERT #define USE_FP_CONVERT
#define reg_EAX
#define reg_ECX
#define reg_EDX
#define reg_EBX
#define reg_ESP
#define reg_EBP
#define reg_ESI
#define reg_EDI
#endif #endif
#ifdef __s390__ #ifdef __s390__
register unsigned int T0 asm("r7"); register unsigned int T0 asm("r7");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册