From: Martin Bochnig <mb1x@gmx.com>
To: qemu-discuss@opensolaris.org
Cc: qemu-devel@nongnu.org
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 [thread overview]
Message-ID: <4524FB3A.3070004@gmx.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 4204 bytes --]
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
[-- Attachment #2: qemu-0.8.2-solaris20060930__v9_stubs.gdiff --]
[-- Type: text/plain, Size: 10391 bytes --]
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 other threads:[~2006-10-05 12:35 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=4524FB3A.3070004@gmx.com \
--to=mb1x@gmx.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-discuss@opensolaris.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.