qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Suggested stubs for coming a bit closer to functional nativ


From: Martin Bochnig
Subject: [Qemu-devel] Suggested stubs for coming a bit closer to functional native sparcv9 HOST support:
Date: Thu, 05 Oct 2006 14:31:54 +0200
User-agent: Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7) Gecko/20041221

Hi,

<<qemu-0.8.2-solaris20060930__v9_stubs.gdiff>>
## only a messy personal testing-snapshot FYI, with no compatibility or
clarity in mind
## a gdiff -Nurb against 20060930's
http://www.opensolaris.org/os/project/qemu/downloads/qemu-0.8.2-solaris.tar.gz

Current Status:
=============

This is still the very best I can get on an OpenSolaris sparc64 host
when cd'ing to linux-test (from
http://www.qemu.com/linux-test-0.5.1.tar.gz) and running
#
/tmp/Q_E_M_U/sparcv9_testing/qemu-0.8.2-solaris__v9_stubs/i386-softmmu/qemu 
-nographic -hda linux.img -kernel bzImage-2.4.21 -append "console=ttyS0
root=/dev/hda sb=0x220,5,1,5 ide2=noprobe ide3=noprobe ide4=noprobe
ide5=noprobe" -d all  :


# uname -a
SunOS mb1x-ws1 5.11 snv_41 sun4u sparc SUNW,Sun-Fire-280R
# isainfo -k
sparcv9
# ls -al /tmp/qemu.log
-rw-r--r--   1 root     root        2022 Oct  5 13:03 /tmp/qemu.log
# cat /tmp/qemu.log
EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000600
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00000000
EIP=0000fff0 EFL=00000002 [-------] CPL=0 II=0 A20=1 HLT=0
ES =0000 00000000 0000ffff 00000000
CS =f000 ffff0000 0000ffff 00000000
SS =0000 00000000 0000ffff 00000000
DS =0000 00000000 0000ffff 00000000
FS =0000 00000000 0000ffff 00000000
GS =0000 00000000 0000ffff 00000000
LDT=0000 00000000 0000ffff 00008000
TR =0000 00000000 0000ffff 00008000
GDT=     00000000 0000ffff
IDT=     00000000 0000ffff
CR0=60000010 CR2=00000000 CR3=00000000 CR4=00000000
CCS=00000000 CCD=00000000 CCO=EFLAGS
----------------
IN:
0xfffffff0:  ljmp   $0xf000,$0xe05b

OP:
0x0000: movl_T0_im 0xf000
0x0001: movl_T1_imu 0xe05b
0x0002: movl_seg_T0_vm 0x4c
0x0003: movl_T0_T1
0x0004: jmp_T0
0x0005: movl_T0_0
0x0006: exit_tb
0x0007: end

AFTER FLAGS OPT:
0x0000: movl_T0_im 0xf000
0x0001: movl_T1_imu 0xe05b
0x0002: movl_seg_T0_vm 0x4c
0x0003: movl_T0_T1
0x0004: jmp_T0
0x0005: movl_T0_0
0x0006: exit_tb
0x0007: end

OUT: [size=124]
0x101242060:  sethi  %hi(0), %o5
0x101242064:  or  %o5, 1, %o5   ! 0x1
0x101242068:  unknown
0x10124206c:  sethi  %hi(0x11f9400), %o4
0x101242070:  add  %o5, %o4, %o5
0x101242074:  mov  %o5, %o5
0x101242078:  mov  %o5, %g4
0x10124207c:  sethi  %hi(0), %o5
0x101242080:  or  %o5, 1, %o5   ! 0x1
0x101242084:  unknown
0x101242088:  sethi  %hi(0x11f9400), %o4
0x10124208c:  add  %o5, %o4, %o5
0x101242090:  or  %o5, 0x5b, %o5
0x101242094:  mov  %o5, %g5
0x101242098:  sethi  %hi(0xfc00), %o5
0x10124209c:  or  %o5, 0x3ff, %o5       ! 0xffff
0x1012420a0:  and  %g4, %o5, %o3
0x1012420a4:  sethi  %hi(0), %o5
0x1012420a8:  or  %o5, 1, %o5   ! 0x1
0x1012420ac:  unknown
0x1012420b0:  sethi  %hi(0x11f9400), %o4
0x1012420b4:  add  %o5, %o4, %o5
0x1012420b8:  or  %o5, 0x4c, %o5
0x1012420bc:  add  %g3, %o5, %o5
0x1012420c0:  st  %o3, [ %o5 ]
0x1012420c4:  sll  %o3, 4, %o3
0x1012420c8:  st  %o3, [ %o5 + 4 ]
0x1012420cc:  mov  %g5, %g4
0x1012420d0:  st  %g4, [ %g3 + 0x20 ]
0x1012420d4:  clr  %g4
0x1012420d8:  jmp  %i0 + 8

# file
/tmp/Q_E_M_U/sparcv9_testing/qemu-0.8.2-solaris__v9_stubs/i386-softmmu/qemu
i386-softmmu/qemu:      ELF 64-bit MSB executable SPARCV9 Version 1,
dynamically linked, not stripped
#


Summary
=========

I know, being able to natively build for sparcv9 is not "required" by
any means (because ultrasparc asm [i.e. ticks] _can_ already be used via
sparcv8plus [which is basically 32bit with UltraSPARC extensions / no
v8plus cpu ever existed], no sparc-X-sparc kqemu LKM driver exists as of
now that would make building for sparcv9 a requirement, and of course
can qemu be built now for v8plus, v8 or v7 [special thanks again to
Juergen Keil and Johannes Schindelin] and then be run under a booted
sparcv9 host kernel), but it would be interesting to see, how one would
get it working / what is still missing.

References:
http://www.cs.utexas.edu/users/novak/sparcv9.pdf
http://libvncserver.sourceforge.net/qemu/qemu-porting.html
http://www.qemu.com/qemu-tech.html

p.s. I finally return to the rather trivial task of bringing the
promised SUNWqemu and CSWqemu packages out, plus a patch against
http://www.qemu.com/qemu-0.8.2.tar.gz
Globally switching to current CVS afterwards (already tested it on sparc32).
I apologize for the delay.


Regards,
Maddin
http://www.martux.org
diff -Nurb ./qemu-0.8.2-solaris__20060930/Makefile 
./qemu-0.8.2-solaris__v9_stubs/Makefile
--- ./qemu-0.8.2-solaris__20060930/Makefile     2006-09-13 09:40:58.000000000 
+0200
+++ ./qemu-0.8.2-solaris__v9_stubs/Makefile     2006-10-05 11:23:34.109516000 
+0200
@@ -5,12 +5,12 @@
 .PHONY: all clean distclean dvi info install install-doc tar tarbin \
        speed test test2 html dvi info
 
-CFLAGS+=-Wall -O2 -g -fno-strict-aliasing -I.
+CFLAGS+=-Wall -O1 -g -fno-strict-aliasing -I.
 ifdef CONFIG_DARWIN
 CFLAGS+= -mdynamic-no-pic
 endif
 ifeq ($(ARCH),sparc)
-CFLAGS+=-mcpu=ultrasparc
+CFLAGS+=-mcpu=ultrasparc -O2
 endif
 LDFLAGS+=-g
 LIBS=
diff -Nurb ./qemu-0.8.2-solaris__20060930/Makefile.target 
./qemu-0.8.2-solaris__v9_stubs/Makefile.target
--- ./qemu-0.8.2-solaris__20060930/Makefile.target      2006-09-13 
09:40:58.000000000 +0200
+++ ./qemu-0.8.2-solaris__v9_stubs/Makefile.target      2006-10-05 
12:11:45.427095200 +0200
@@ -17,7 +17,7 @@
 VPATH+=:$(SRC_PATH)/linux-user
 DEFINES+=-I$(SRC_PATH)/linux-user -I$(SRC_PATH)/linux-user/$(TARGET_ARCH)
 endif
-CFLAGS+=-Wall -O2 -g -fno-strict-aliasing
+CFLAGS+=-Wall -O1 -g -fno-strict-aliasing
 #CFLAGS+=-Werror
 LDFLAGS+=-g 
 LIBS=
@@ -108,7 +108,7 @@
 
 ifeq ($(ARCH),sparc)
 ifeq ($(CONFIG_SOLARIS),yes)
-CFLAGS+=-mcpu=ultrasparc -m32 -ffixed-g2 -ffixed-g3
+CFLAGS+=-mcpu=ultrasparc -m32 -ffixed-g1 -ffixed-g2 -ffixed-g4 -ffixed-g5 
-ffixed-g6 -ffixed-g7 -ffixed-l0 -ffixed-l1 -ffixed-l2 -ffixed-l3 
 LDFLAGS+=-m32
 OP_CFLAGS=$(CFLAGS) -fno-delayed-branch -fno-omit-frame-pointer -ffixed-i0
 else
@@ -122,10 +122,12 @@
 endif
 
 ifeq ($(ARCH),sparc64)
-CFLAGS+=-mcpu=ultrasparc -m64 -ffixed-g1 -ffixed-g4 -ffixed-g5 -ffixed-g7
+CFLAGS+=-mcpu=ultrasparc -m64 -ffixed-g1 -ffixed-g2 -ffixed-g4 -ffixed-g5 
-ffixed-g6 -ffixed-g7 -ffixed-l0 -ffixed-l1 -ffixed-l2 -ffixed-l3
 LDFLAGS+=-m64
-LDFLAGS+=-Wl,-T,$(SRC_PATH)/sparc64.ld
+# LDFLAGS+=-Wl,-T,$(SRC_PATH)/sparc64.ld
+# only when linking with gld
 OP_CFLAGS=$(CFLAGS) -fno-delayed-branch -ffixed-i0
+DEFINES+=-D__sparc_v9__
 endif
 
 ifeq ($(ARCH),alpha)
@@ -417,7 +419,8 @@
 
 ifeq ($(ARCH),sparc64)
 VL_LDFLAGS+=-m64
-VL_LDFLAGS+=-Wl,-T,$(SRC_PATH)/sparc64.ld
+# VL_LDFLAGS+=-Wl,-T,$(SRC_PATH)/sparc64.ld
+# only when linking with gld
 endif
 
 ifeq ($(CONFIG_SOLARIS),yes)
diff -Nurb ./qemu-0.8.2-solaris__20060930/configure 
./qemu-0.8.2-solaris__v9_stubs/configure
--- ./qemu-0.8.2-solaris__20060930/configure    2006-09-13 09:44:11.000000000 
+0200
+++ ./qemu-0.8.2-solaris__v9_stubs/configure    2006-10-05 11:47:42.903664400 
+0200
@@ -24,9 +24,9 @@
 cc="gcc"
 host_cc="gcc"
 ar="ar"
-make="make"
-install="install"
-strip="strip"
+make="gmake"
+install="ginstall"
+strip="gstrip"
 cpu=`uname -m`
 target_list=""
 case "$cpu" in
@@ -51,7 +51,7 @@
   s390)
     cpu="s390"
   ;;
-  sparc|sun4[muv])
+  sparc|sun4[cdmuv])
     cpu="sparc"
   ;;
   sparc64)
@@ -98,6 +98,13 @@
 build_acpi_tables="no"
 force_64bit="no"
 force_64bitflags=""
+build_for_sparcv7="no"
+build_for_sparcv7flags=""
+build_for_sparcv8="no"
+build_for_sparcv8flags=""
+build_for_sparcv8plus="no"
+build_for_sparcv8plusflags=""
+
 uname_release=""
 
 # OS specific
@@ -247,29 +254,45 @@
   ;;
   --force-64bit) 
       force_64bit="yes"
-      CFLAGS="$CFLAGS -m64 -mpreferred-stack-boundary=4 -fomit-frame-pointer"
       LDFLAGS="$LDFLAGS -m64"
       force_64bitflags="-m64"
       case "$cpu" in
          i386)
-           echo "Forcing 64-bit mode, changing CPU from $cpu to x86_64"
+           echo "Forcing 64-bit mode, changing HOST-CPU from $cpu to x86_64"
            cpu="x86_64"
+           CFLAGS="$CFLAGS -m64 -mpreferred-stack-boundary=4 
-fomit-frame-pointer"
          ;;
          sparc*)
-           echo "Forcing 64-bit mode, changing CPU from $cpu to sparc64"
+           echo "Developers only: Forcing 64-bit mode, changing HOST-CPU from 
$cpu to sparc64"
            cpu="sparc64"
+           CFLAGS="$CFLAGS -m64 -fomit-frame-pointer"
          ;;
          *)
            echo "Forcing 64-bit mode"
          ;;
       esac
   ;;
+  --build_for_sparcv7)
+      build_for_sparcv7="yes"
+      CFLAGS="$CFLAGS -m32 -mcpu=v7 -fomit-frame-pointer"
+      LDFLAGS="$LDFLAGS -m32"
+  ;;
+  --build_for_sparcv8)
+      build_for_sparcv8="yes"
+      CFLAGS="$CFLAGS -m32 -mcpu=v8 -fomit-frame-pointer"
+      LDFLAGS="$LDFLAGS -m32"
+  ;;
+  --build_for_sparcv8plus)
+      build_for_sparcv8plus="yes"
+      CFLAGS="$CFLAGS -m32 -mcpu=ultrasparc -fomit-frame-pointer"
+      LDFLAGS="$LDFLAGS -m32"
+  ;;
   esac
 done
 
 # Checking for CFLAGS
 if test -z "$CFLAGS"; then
-    CFLAGS="-O2"
+    CFLAGS="-O1"
 fi
 
 if test x"$show_help" = x"yes" ; then
@@ -314,6 +337,9 @@
 echo "  --enable-uname-release=R Return R for uname -r in usermode emulation"
 echo "  --enable-iasl            compilation of ACPI tables with the IASL 
compiler"
 echo "  --force-64bit            force 64-bit compilation (Solaris x86/x64 
only)"
+echo "  --build_for_sparcv7      force compilation for sparcv7 HOST-CPU"
+echo "  --build_for_sparcv8      force compilation for sparcv8 HOST-CPU"
+echo "  --build_for_sparcv8plus      force compilation for sparcv8plus 
HOST-CPU"
 echo ""
 echo "NOTE: The object files are build at the place where configure is 
launched"
 exit 1
@@ -489,7 +515,7 @@
 int main( void ) { return SDL_Init (SDL_INIT_VIDEO); }
 EOF
 
-if $cc $force_64bitflags -o $TMPE `$sdl_config --cflags 2> /dev/null` $TMPC 
`$sdl_config --libs 2> /dev/null` 2> /dev/null ; then
+if $cc $force_64bitflags $build_for_sparcv7flags $build_for_sparcv8flags 
$build_for_sparcv8plusflags -o $TMPE `$sdl_config --cflags 2> /dev/null` $TMPC 
`$sdl_config --libs 2> /dev/null` 2> /dev/null ; then
 _sdlversion=`$sdl_config --version | sed 's/[^0-9]//g'`
 if test "$_sdlversion" -lt 121 ; then
 sdl_too_old=yes
diff -Nurb ./qemu-0.8.2-solaris__20060930/cpu-all.h 
./qemu-0.8.2-solaris__v9_stubs/cpu-all.h
--- ./qemu-0.8.2-solaris__20060930/cpu-all.h    2006-07-22 19:23:34.000000000 
+0200
+++ ./qemu-0.8.2-solaris__v9_stubs/cpu-all.h    2006-10-01 02:15:12.000000000 
+0200
@@ -971,7 +971,7 @@
     return val;
 }
 
-#elif defined(__sparc_v9__)
+#elif defined(__sparc__)
 
 static inline int64_t cpu_get_real_ticks (void)
 {
diff -Nurb ./qemu-0.8.2-solaris__20060930/dyngen-exec.h 
./qemu-0.8.2-solaris__v9_stubs/dyngen-exec.h
--- ./qemu-0.8.2-solaris__20060930/dyngen-exec.h        2006-07-22 
19:23:34.000000000 +0200
+++ ./qemu-0.8.2-solaris__v9_stubs/dyngen-exec.h        2006-10-05 
13:37:58.665144200 +0200
@@ -38,7 +38,7 @@
 // Linux/Sparc64 defines uint64_t
 #if !(defined (__sparc_v9__) && defined(__linux__))
 /* XXX may be done for all 64 bits targets ? */
-#if defined (__x86_64__) || defined(__ia64)
+#if defined(__x86_64__) || defined(__ia64) || defined(__sparc_v9__)
 typedef unsigned long uint64_t;
 #else
 typedef unsigned long long uint64_t;
@@ -55,7 +55,7 @@
 typedef signed int int32_t;
 // Linux/Sparc64 defines int64_t
 #if !(defined (__sparc_v9__) && defined(__linux__))
-#if defined (__x86_64__) || defined(__ia64)
+#if defined(__x86_64__) || defined(__ia64) || defined(__sparc_v9__)
 typedef signed long int64_t;
 #else
 typedef signed long long int64_t;
@@ -126,19 +126,25 @@
 #define AREG2 "s1"
 #define AREG3 "s2"
 #endif
+
 #ifdef __sparc__
 #ifdef HOST_SOLARIS
-#define AREG0 "g2"
-#define AREG1 "g3"
-#define AREG2 "g4"
-#define AREG3 "g5"
-#define AREG4 "g6"
-#else
-#ifdef __sparc_v9__
-#define AREG0 "g1"
+#define AREG0 "g3"
 #define AREG1 "g4"
 #define AREG2 "g5"
-#define AREG3 "g7"
+#define AREG3 "g6"
+/* #define AREG4 "l0" */  
+/* Solaris sparcv8/v8plus versus sparcv9 ABI: g0 is always 0, g1 gets 
clobbered 
+ * after function call, g2 cannot be used on v9 due to ABI and libm warning, 
g7 
+ * gets clobbered, g3 does _not_ give libm caused /usr/ccs/bin/ld 
MSG_STO_REGISTERG3 warning 
+ * anymore (see 
http://cvs.opensolaris.org/source/raw/on/usr/src/cmd/sgs/libld/common/libld.sparc.msg),
+ * now that we manually define -D__sparc_v9__
+ * inputs or outputs cannot be used at all, due to shifting rw,
+ * locals can potentially be used, if they are saved and restored each time 
+ * (see cpu-exec.c) 
+ * sparc-LinUX's ABI seems to be less restrictive here, just downloading a 
recent Aurora ...  
+ */ 
+
 #else
 #define AREG0 "g6"
 #define AREG1 "g1"
diff -Nurb ./qemu-0.8.2-solaris__20060930/dyngen.c 
./qemu-0.8.2-solaris__v9_stubs/dyngen.c
--- ./qemu-0.8.2-solaris__20060930/dyngen.c     2006-07-22 19:23:34.000000000 
+0200
+++ ./qemu-0.8.2-solaris__v9_stubs/dyngen.c     2006-10-01 08:48:03.000000000 
+0200
@@ -2270,6 +2270,38 @@
                                     reloc_offset, reloc_offset, name, addend,
                                    reloc_offset);
                             break;
+
+
+
+                        case R_SPARC_HH22:
+                            fprintf(outfile,
+                                   "    *(uint32_t *)(gen_code_ptr + %d) = "
+                                   "((*(uint32_t *)(gen_code_ptr + %d)) "
+                                   " & ~0x00000000) "
+                                   " | (((%s + %d) >> 42) & 0x00000000);\n",
+                                    reloc_offset, reloc_offset, name, addend);
+                             break;
+
+                       case R_SPARC_LM22:
+                            fprintf(outfile,
+                                   "    *(uint32_t *)(gen_code_ptr + %d) = "
+                                   "((*(uint32_t *)(gen_code_ptr + %d)) "
+                                   " & ~0x00000000) "
+                                   " | (((%s + %d) >> 10) & 0x00000000);\n",
+                                    reloc_offset, reloc_offset, name, addend);
+                           break;
+
+                       case R_SPARC_HM10:
+                            fprintf(outfile,
+                                   "    *(uint32_t *)(gen_code_ptr + %d) = "
+                                   "((*(uint32_t *)(gen_code_ptr + %d)) "
+                                   " & ~0x00000000) "
+                                   " | ((((%s + %d) >> 32 & 0x3ff)) & 
0x00000000);\n",
+                                    reloc_offset, reloc_offset, name, addend);
+                           break;
+
+
+
                         default:
                            error("unsupported sparc64 relocation (%d) for 
symbol %s", type, name);
                         }
diff -Nurb ./qemu-0.8.2-solaris__20060930/elf.h 
./qemu-0.8.2-solaris__v9_stubs/elf.h
--- ./qemu-0.8.2-solaris__20060930/elf.h        2006-07-22 19:23:34.000000000 
+0200
+++ ./qemu-0.8.2-solaris__v9_stubs/elf.h        2006-10-01 01:39:27.000000000 
+0200
@@ -328,6 +328,9 @@
 #define R_SPARC_11             31
 #define R_SPARC_64             32
 #define R_SPARC_OLO10           33
+#define R_SPARC_HH22            34
+#define R_SPARC_HM10            35
+#define R_SPARC_LM22            36
 #define R_SPARC_WDISP16                40
 #define R_SPARC_WDISP19                41
 #define R_SPARC_7              43

reply via email to

[Prev in Thread] Current Thread [Next in Thread]