; Special MR registers to investigate: r19 (inst addr), r26 (error) MRDataStorageInt ; Consult DSISR and the page table to decide what to do mfdsisr r31 ; Check DSISR for simple HTAB miss andis. r28, r31, 0xC030 ; (bits 0/1/10/11) mfsprg r1, 1 mfdar r27 bne @possible_htab_miss andis. r28, r31, 0x0800 ; Illegal data access (else crash!) addi r29, r1, 0x320 ; ?bug -> PutPTE used to accept this arg bnel PutPTE ; Read the failing PTE to r30/r31 li r28, 0x43 ; Filter Writethru and Protection bits and r28, r31, r28 cmpwi cr7, r28, 0x43 beql SystemCrash ; Not illegal data access => Crash mfsprg r28, 2 mtlr r28 bne cr7, @access_exception ; Any filtered bit unset => Exception mfsrr0 r28 ; Writethru and Protection bits set => ROM write nop addi r28, r28, 4 lwz r26, KDP.NKInfo.QuietWrite(r1) mtsrr0 r28 addi r26, r26, 1 stw r26, KDP.NKInfo.QuietWrite(r1) @return extrwi r26, r25, 8, 22 ; Signal to some MemRetry code? rfi @access_exception andi. r28, r31, 3 li r8, ecDataSupAccessViolation beq ExceptionAfterRetry cmpwi r28, 3 li r8, ecDataWriteViolation beq ExceptionAfterRetry ; Nobody allowed to write => Exception li r8, ecDataSupWriteViolation b ExceptionAfterRetry ; Supervisor allowed to write => Exception @possible_htab_miss andis. r28, r31, 0x8010 ; Check for DataAccess Interrupt or ec[io]wx bne MRHardwareFault ; Either of those => big trouble bl PutPTE ; HTAB miss => fill HTAB mfsprg r28, 2 ; (restore lr) mtlr r28 beq @return ; HTAB success => RFI li r8, ecDataPageFault blt ExceptionAfterRetry ; Fault => Exception li r8, ecDataInvalidAddress b ExceptionAfterRetry ; Bad address => Exception MRMachineCheckInt ; Always gives HW fault mfsprg r1, 1 lwz r27, KDP.HtabLastEA(r1) subf r28, r19, r27 ; Delete last HTAB entry if suspicious cmpwi r28, -16 blt @no_htab_del cmpwi r28, 16 bgt @no_htab_del lwz r28, KDP.NKInfo.HashTableDeleteCount(r1) lwz r29, KDP.ApproxCurrentPTEG(r1) addi r28, r28, 1 stw r28, KDP.NKInfo.HashTableDeleteCount(r1) li r28, 0 stw r28, 0(r29) sync tlbie r27 sync @no_htab_del MRHardwareFault ; Can come from a DSI or a Machine Check cmplw r10, r19 li r8, ecDataHardwareFault bne ExceptionAfterRetry mtsprg 3, r24 lmw r14, KDP.r14(r1) li r8, ecInstHardwareFault b Exception