[OpenBIOS] ppc64 MMU issues
Andreas Färber
andreas.faerber at web.de
Tue Nov 9 21:01:56 CET 2010
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.
> Btw, are you sure this code is correct? Usually the stack frame
> includes the old r1 value as well. In __kvmppc_vcpu_entry (arch/
> powerpc/kvm/book3s_interrupts.S) I have working code that basically
> does an ABI compliant function in asm:
>
> /* Save host state to the stack */
> PPC_STLU r1, -SWITCH_FRAME_SIZE(r1)
Haven't checked. I spotted an instance where two of the three stacks
have a potential stack frame overlap though.
>> , plus the m*msr
>
> mfmsr r1 ; /* unset MSR_SF */ \
> clrlwi r1,r1,0 ; \
> mtmsr r1 ; \
>
> This one? Yeah, my awesome broken code. Just replace it with:
>
> // PPC32
>
> #define MFMSRD mfmsr
> #define MTMSRD mtmsr
>
> // PPC64
>
> #define MFMSRD mfmsrd
> #define MTMSRD mtmsrd
>
> // code
>
> MFMSRD r1
> MTMSRD r1
>
>
> The clearing is not necessary. If it is, qemu or kvm are broken.
> According to the spec, mfmsr and mtmsr only handle the first 32 bits
> of MSR.
I've been working without on ppc64, MSR looked okay.
>> and the trailing/leading stack manipulation (16 in SVR4 vs. 48 in
>> PowerOpen ABI).
>
> Not sure I understand exactly what you mean here :).
addi r1, r1, -x
addi r1, r1, x
:)
Btw I still don't understand what ABI this is supposed to be. If I can
trust Hollis' ppc assembler article and the Mono and QEMU ppc64 ports,
then Linux/ppc64 uses function descriptors. But our ppc64 assembler
code calling setup_mmu() and entry() works without a function
descriptor dereference...
>> Also rfid, both here and for the FPU vector.
>
> // PPC32
>
> #define RFID rfi
>
> // PPC64
>
> #define RFID rfid
>
> should work, no?
Yeah, if that's the naming convention we want to go with.
> Btw, you should probably define those helpers somewhere generic
> depending on #ifdef __powerpc64__
>
>> Note that the other ppc targets don't use assembler macros, just
>> preprocessor macros, so we have kind of a double-macro situation. ;)
>
> Yes, please don't use assembler macros. If I did that anywhere, I
> did it wrong :). preprocessor macros are the way to go! :)
Both have their advantages imo when used correctly.
Andreas
More information about the OpenBIOS
mailing list