On 3/7/08, Blue Swirl <[EMAIL PROTECTED]> wrote: > On 3/7/08, Stuart Brady <[EMAIL PROTECTED]> wrote: > > On Fri, Mar 07, 2008 at 08:47:03PM +0200, Blue Swirl wrote: > > > On 3/7/08, Stuart Brady <[EMAIL PROTECTED]> wrote: > > > > > > tcg_target_reg_alloc_order[] has 32 elements, but only 14 are used. > > > > The rest hold 0, specifying TCG_REG_G0. > > > > > > I see. That could be asking for trouble. > > > > > > Possibly not, as g0 is marked as reserved, but it looks to me like bug, > > regardless of whether it causes any harm, so I've submitted a patch. > > > > > > > > I don't understand -- o7 is required when returning in exit_tb, so if > it > > > > is used, it must be saved and restored. > > > > > > Not exit_tb, but call. > > > > > > Right, op_call does need to link, and that clobbers the link register, > > so it must be restored -- but I've a feeling that this isn't happening. > > I expect you could copy o7 to/from i5 before/after the call (or jmpl)... > > although I'm not sure if you'd also need to save the frame pointer. > > > Another possibility is to add function epilogue with save and add > restore to ret (or use v9 return).
I added the save and restore instructions, because if the generated code made any calls, the registers were overwritten. Currently on Sparc64 host a small helloworld program executes until the system call, then Qemu dies with illegal instruction. It looks like this is caused by setjmp/longjmp register mangling bugs in Linux glibc, my workaround does not help. I'd be interested to hear if this works any better on Solaris/Sparc or *BSD/Sparc. On Sparc32 TB linking does not work, so Qemu dies on TB switch.
#define __KERNEL__ #include <asm/unistd.h> static int errno; static __inline__ _syscall1(void,exit,int,exitval) static inline _syscall3(int,write,int,fd,const char *,buf,long,count) int _start() { write(2, "Hello World!\n", sizeof("Hello World!\n")); exit(0); }
helloworld.sparc32
Description: Binary data