diff -Naur -X exclude-files ac_cur/arch/um/Makefile-i386 ac/arch/um/Makefile-i386 --- ac_cur/arch/um/Makefile-i386 Sat Sep 15 15:56:11 2001 +++ ac/arch/um/Makefile-i386 Sat Sep 15 20:58:19 2001 @@ -1,3 +1,3 @@ START_ADDR = 0x10000000 -ARCH_CFLAGS = -U__$(SUBARCH)__ -U$(SUBARCH) +ARCH_CFLAGS = -U__$(SUBARCH)__ -U$(SUBARCH) -DUM_FASTCALL ELF_SUBARCH = $(SUBARCH) diff -Naur -X exclude-files ac_cur/arch/um/include/sysdep-ppc/sigcontext.h ac/arch/um/include/sysdep-ppc/sigcontext.h --- ac_cur/arch/um/include/sysdep-ppc/sigcontext.h Sat Sep 15 15:56:11 2001 +++ ac/arch/um/include/sysdep-ppc/sigcontext.h Sat Sep 15 20:58:19 2001 @@ -11,6 +11,8 @@ struct sigcontext name; \ name.regs = &name##_regs +#define DSISR_WRITE 0x02000000 + #define SC_FAULT_ADDR(sc) ({ \ struct sigcontext_struct *_sc = (sc); \ long retval = -1; \ @@ -29,7 +31,23 @@ retval; \ }) -#define SC_FAULT_WRITE(sc) (!!(((sc)->regs->dsisr) & 0x02000000)) +#define SC_FAULT_WRITE(sc) ({ \ + struct sigcontext_struct *_sc = (sc); \ + long retval = -1; \ + switch (_sc->regs->trap) { \ + case 0x300: \ + /* data exception */ \ + retval = !!(_sc->regs->dsisr & DSISR_WRITE); \ + break; \ + case 0x400: \ + /* instruction exception: not a write */ \ + retval = 0; \ + break; \ + default: \ + panic("SC_FAULT_ADDR: unhandled trap type\n"); \ + } \ + retval; \ + }) #define SC_IP(sc) ((sc)->regs->nip) #define SC_SP(sc) ((sc)->regs->gpr[1]) diff -Naur -X exclude-files ac_cur/arch/um/sys-ppc/Makefile ac/arch/um/sys-ppc/Makefile --- ac_cur/arch/um/sys-ppc/Makefile Sat Sep 15 16:46:07 2001 +++ ac/arch/um/sys-ppc/Makefile Sat Sep 15 20:58:19 2001 @@ -14,7 +14,7 @@ rm -f $@ $(LD) $(LINKFLAGS) --start-group $^ --end-group -o $@ -ptrace.o: ptrace.c +ptrace_user.o: ptrace_user.c $(CC) -D__KERNEL__ $(USER_CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $< sigcontext.o: sigcontext.c diff -Naur -X exclude-files ac_cur/arch/um/sys-ppc/sigcontext.c ac/arch/um/sys-ppc/sigcontext.c --- ac_cur/arch/um/sys-ppc/sigcontext.c Sat Sep 15 15:56:11 2001 +++ ac/arch/um/sys-ppc/sigcontext.c Sat Sep 15 20:58:19 2001 @@ -24,8 +24,11 @@ sc->regs->trap = err; sc->regs->dar = cr2; #endif - *(sc->regs) = *regs; - // DAR, DSISR, RESULT? + /* This is a bit of a hack; there's some confusion with the + * various definitions of [sys_]pt_regs, and everything isn't + * quite coming together quite right. */ + memcpy(sc->regs, regs, sizeof(struct sys_pt_regs)); + /*(sc->regs) = *regs; */ } /* diff -Naur -X exclude-files ac_cur/include/asm-um/processor-ppc.h ac/include/asm-um/processor-ppc.h --- ac_cur/include/asm-um/processor-ppc.h Sat Sep 15 15:56:38 2001 +++ ac/include/asm-um/processor-ppc.h Sat Sep 15 20:58:27 2001 @@ -2,7 +2,11 @@ #define __UM_PROCESSOR_PPC_H #if defined(__ASSEMBLY__) + #define CONFIG_ALL_PPC +#include "arch/processor.h" + +#else #include "asm/processor-generic.h" diff -Naur -X exclude-files ac_cur/include/asm-um/system-ppc.h ac/include/asm-um/system-ppc.h --- ac_cur/include/asm-um/system-ppc.h Sat Sep 15 15:56:38 2001 +++ ac/include/asm-um/system-ppc.h Sat Sep 15 20:58:31 2001 @@ -3,6 +3,12 @@ #define pt_regs sys_pt_regs +#define _switch_to _ppc_switch_to + +#include "asm/arch/system.h" + +#undef _switch_to + #include "asm/system-generic.h" #undef pt_regs diff -Naur -X exclude-files ac_cur/include/linux/kernel.h ac/include/linux/kernel.h --- ac_cur/include/linux/kernel.h Sat Sep 15 20:48:05 2001 +++ ac/include/linux/kernel.h Sat Sep 15 21:03:45 2001 @@ -40,7 +40,7 @@ # define ATTRIB_NORET __attribute__((noreturn)) # define NORET_AND noreturn, -#ifdef __i386__ +#if defined(__i386__) || defined(UM_FASTCALL) #define FASTCALL(x) x __attribute__((regparm(3))) #else #define FASTCALL(x) x