Am 09.11.2010 um 22:48 schrieb Alexander Graf:
On 09.11.2010, at 22:34, Andreas Färber wrote:
Am 09.11.2010 um 21:24 schrieb Alexander Graf:
On 09.11.2010, at 21:01, Andreas Färber wrote:
Am 09.11.2010 um 12:53 schrieb Alexander Graf:
On 08.11.2010, at 23:18, Andreas Färber wrote:
Am 08.11.2010 um 23:03 schrieb Alexander Graf:
> On 08.11.2010, at 22:48, Andreas Färber wrote: > >> Am 08.11.2010 um 10:34 schrieb Mark Cave-Ayland: >> >>> Andreas Färber wrote: >>> >>>> Since r945 everything except for the trampoline issue >>>> should be in SVN. >>> >>> Cool! :) >> >> Ah, no! Forgot about the exception handlers (preamble, >> epilogue). :( I have local patches that #ifdef the whole >> definitions and provide alternative ones for ppc64. But I'd >> rather supply a 2-step patch to drop the template macros and >> use #ifdef'ery inside the macro definition for ppc64/ppc >> differences, given that long-term we won't need the second >> version. > > Are you sure you need that? Most of the stuff should be > generic. Please take a look at Linux's PPC_LL macro for > example. The stack layout varies slightly, but that should > also be reasonably easy to catch.
Problematic parts are the ULONG_SIZE comparisons for the number of registers that we can't #ifdef away inside an CPP macro
You're talking about this piece of code, right?
.ifc ULONG_SIZE, 8 ; \ addi r1,r1,-(40 * ULONG_SIZE) ; /* push exception frame */ \ .else ; \ addi r1,r1,-(20 * ULONG_SIZE) ; /* push exception frame */ \ .endif ; \ \
Just replace it with
// PPC32
#define EXCEPTION_STACK_LEN (20 * 4)
// PPC64
#define EXCEPTION_STACK_LEN (40 * 8)
// code
addi r1, r1,-EXCEPTION_STACK_LEN
No, no, no! This is exactly the type of differences I wanted to rip out, but if I do so now I would break ppc64 support. On __powerpc64__ this doesn't need to be 40, and it's not just the above immediate but the whole .ifc around the 20 additional register stores/loads:
#define EXCEPTION_PREAMBLE_TEMPLATE \ ... stl r11,(11 * ULONG_SIZE)(r1) ; \ stl r12,(12 * ULONG_SIZE)(r1) ; \ .ifc ULONG_SIZE, 8 ; \ stl r13,(17 * ULONG_SIZE)(r1) ; \ stl r14,(18 * ULONG_SIZE)(r1) ; \ ...
.macro EXCEPTION_PREAMBLE EXCEPTION_PREAMBLE_TEMPLATE .endm ... .macro EXCEPTION_PREAMBLE_64 EXCEPTION_PREAMBLE_TEMPLATE .endm
My problem is the reuse of the _TEMPLATE macros. It becomes a matter of macros such as those you suggest if we can get rid of that.
Why are there two different preambles? Just always use the 64-bit one for 64-bit openBIOS and 32-bit one for 32-bit openBIOS.
Quoting myself: "I would break ppc64 support"
obj-ppc64/openbios-qemu.elf: EXCEPTION_PREAMBLE => optionally used for qemu-system-ppc64, not yet working
obj-ppc/openbios-qemu.elf: EXCEPTION_PREAMBLE => used for qemu-system-ppc EXCEPTION_PREAMBLE_64 => currently used for qemu-system-ppc64 by patching the exception vectors based on PVR-determined CPU init function
Thus, if we drop the latter before ppc64 is up and running we would no longer have a working openbios-ppc for qemu-system-ppc64.
I still don't see why. We can just use a ppc32 compiled version for working ppc64 support, no? The only reason I put us back to 32bit mode was because otherwise lis -1 would end up being -1 instead of 0xffff0000 :).
So why don't you just keep the current code working, duplicate it for the time being for ppc64 and then once everything works merge it back together?
Pretty sure I mentioned that alternative already... :)
http://repo.or.cz/w/openbios/afaerber.git/blobdiff/97003b1ff3860847ce9ad5c6b...
Tried to avoid that for SVN. But if that's consensus, it sure is the easiest for me!
Andreas