[OpenBIOS] [Qemu-ppc] Running client with MMU off

BALATON Zoltan balaton at eik.bme.hu
Thu Jun 26 01:36:12 CEST 2014


On Wed, 25 Jun 2014, Alexander Graf wrote:
> On 25.06.14 12:40, BALATON Zoltan wrote:
>> On Wed, 25 Jun 2014, BALATON Zoltan wrote:
>>> ppc_store_sdr1: 0fe00000
>>> helper_store_sr: reg=0 20000400 00000000
>> [...]
>>> helper_store_sr: reg=0 00000000 20000400
>>> Raise exception at 0041cd00 => 00000003 (40000000)
>>> 
>>> ^^^ This exception should not happen. It is trying to handle it but the 
>>> handlers are not working yet and gets in an infinite loop. It boots if MMU 
>>> is disabled while this part runs but MorphOS does not disable it yet and 
>>> according to my oftest results they are enabled on Apple too. How does it 
>>> work on real hardware and why does it fail on QEMU? (Note the the value of 
>>> sr0 is identical to the one set by OpenBIOS and SDR1 is unchanged so 
>>> translations via the page table should still work, shouldn't it?)
>> 
>> I was mistaken about the values being the same as it is zeroing sr0. So can 
>> this explain why translation via the page table fails after this and why an 
>> ISI is generated? Why are the sr registers set up with the values above by 
>> OpenBIOS? Could they be 0 instead?
>
> SR registers are used to translate EAs to VAs. If you set them all to 0 they 
> would end up getting the same VSID.

OK but why is SEGR_BASE defined as 0x0400 in arch/ppc/qemu/ofmem.c? If I 
change this to 0 I get closer and it survives zeroing the sr registers but 
it cannot survive zeroing SDR1 and crashes after that happens:

IN:
0x0041cde0: lwz     r0,60(r3)

htab_base 000000000fe00000 htab_mask 000000000000ffff hash 000000000000041c
0 htab=000000000fe00000/000000000000ffff vsid=0 ptem=1 hash=000000000000041c

0x0041cde4: sync

htab_base 000000000fe00000 htab_mask 000000000000ffff hash 000000000000041c
0 htab=000000000fe00000/000000000000ffff vsid=0 ptem=1 hash=000000000000041c

0x0041cde8: mtsr    15,r0

htab_base 000000000fe00000 htab_mask 000000000000ffff hash 000000000000041c
0 htab=000000000fe00000/000000000000ffff vsid=0 ptem=1 hash=000000000000041c

0x0041cdec: isync

htab_base 000000000fe00000 htab_mask 000000000000ffff hash 000000000000041c
0 htab=000000000fe00000/000000000000ffff vsid=0 ptem=1 hash=000000000000041c

htab_base 000000000fe00000 htab_mask 000000000000ffff hash 0000000000000697
0 htab=000000000fe00000/000000000000ffff vsid=0 ptem=1 hash=0000000000000697
found PTE at offset 0000a5e0
PTE access granted !

helper_store_sr: reg=15 00000000 2000000f

htab_base 000000000fe00000 htab_mask 000000000000ffff hash 000000000000041c
0 htab=000000000fe00000/000000000000ffff vsid=0 ptem=1 hash=000000000000041c
found PTE at offset 00000728
PTE access granted !

IN:
0x0041cdf0: sync

htab_base 000000000fe00000 htab_mask 000000000000ffff hash 000000000000041c
0 htab=000000000fe00000/000000000000ffff vsid=0 ptem=1 hash=000000000000041c

0x0041cdf4: mtsdr1  r6

htab_base 000000000fe00000 htab_mask 000000000000ffff hash 000000000000041c
0 htab=000000000fe00000/000000000000ffff vsid=0 ptem=1 hash=000000000000041c

0x0041cdf8: isync

htab_base 000000000fe00000 htab_mask 000000000000ffff hash 000000000000041c
0 htab=000000000fe00000/000000000000ffff vsid=0 ptem=1 hash=000000000000041c

ppc_store_sdr1: 00000000

htab_base 0000000000000000 htab_mask 000000000000ffff hash 000000000000041c
0 htab=0000000000000000/000000000000ffff vsid=0 ptem=1 hash=000000000000041c
1 htab=0000000000000000/000000000000ffff vsid=0 api=1 hash=fffffffffffffbe3
Raise exception at 0041cdfc => 00000003 (40000000)
IN:
0x00000400:  mtsprg  2,r2

What comes after this is loading some values from the stack then disabling 
MMU bits in MSR (then putting the values loaded into BAT regs). If I could 
get these run without getting an ISI inbetween it would boot:

   41ce0c:       82 84 00 14     lwz     r20,20(r4)
   41ce10:       82 a4 00 10     lwz     r21,16(r4)
   41ce14:       82 c4 00 1c     lwz     r22,28(r4)
   41ce18:       82 e4 00 18     lwz     r23,24(r4)
   41ce1c:       83 05 00 04     lwz     r24,4(r5)
   41ce20:       83 25 00 00     lwz     r25,0(r5)
   41ce24:       83 45 00 0c     lwz     r26,12(r5)
   41ce28:       83 65 00 08     lwz     r27,8(r5)
   41ce2c:       83 85 00 14     lwz     r28,20(r5)
   41ce30:       83 a5 00 10     lwz     r29,16(r5)
   41ce34:       83 c5 00 1c     lwz     r30,28(r5)
   41ce38:       83 e5 00 18     lwz     r31,24(r5)
   41ce3c:       7c 00 04 ac     sync
   41ce40:       7c 00 00 a6     mfmsr   r0
   41ce44:       70 00 ff cf     andi.   r0,r0,65487
   41ce48:       7c 00 04 ac     sync
   41ce4c:       7c 00 01 24     mtmsr   r0
   41ce50:       4c 00 01 2c     isync

Why are we getting ISIs on QEMU and why can this work on real hardware 
without crashing?

Regards,
BALATON Zoltan



More information about the OpenBIOS mailing list