#if 0 /* Backup various CPU config stuffs */
bl __save_cpu_setup
#endif /* Call the low level suspend stuff (we should probably have made *astackframe...
*/
bl swsusp_save
/* Restore LR from the save area */
lis r11,swsusp_save_area@h
ori r11,r11,swsusp_save_area@l
lwz r0,SL_LR(r11)
mtlr r0
/* Disable MSR:DR to make sure we don't take a TLB or *hashmissduringthecopy,asourhashtablewill *forawhilebeunusable.For.text,weassumeweare *coveredbyaBAT.Thisworksonlyfornon-G5atthis *point.G5willneedabetterapproach,possiblyusing *asmalltemporaryhashtablefilledwithlargemappings, *disablingtheMMUcompletelyisn'tagoodoptionfor *performancereasons. *(Notethat750'smayhavethesameperformanceissueas *theG5inthiscase,weshouldinvestigateusingmoving *BATsfortheseCPUs)
*/
mfmsr r0
sync
rlwinm r0,r0,0,28,26/* clear MSR_DR */
mtmsr r0
sync
isync
/* Load ptr the list of pages to copy in r3 */
lis r11,(restore_pblist - KERNELBASE)@h
ori r11,r11,restore_pblist@l
lwz r10,0(r11)
/* Copy the pages. This is a very basic implementation, to
* be replaced by something more cache efficient */ 1:
tophys(r3,r10)
li r0,256
mtctr r0
lwz r11,pbe_address(r3) /* source */
tophys(r5,r11)
lwz r10,pbe_orig_address(r3) /* destination */
tophys(r6,r10) 2:
lwz r8,0(r5)
lwz r9,4(r5)
lwz r10,8(r5)
lwz r11,12(r5)
addi r5,r5,16
stw r8,0(r6)
stw r9,4(r6)
stw r10,8(r6)
stw r11,12(r6)
addi r6,r6,16
bdnz 2b
lwz r10,pbe_next(r3)
cmpwi 0,r10,0
bne 1b
/* Do a very simple cache flush/inval of the L1 to ensure *coherencyoftheicache
*/
lis r3,0x0002
mtctr r3
li r3, 0 1:
lwz r0,0(r3)
addi r3,r3,0x0020
bdnz 1b
isync
sync
/* Now flush those cache lines */
lis r3,0x0002
mtctr r3
li r3, 0 1:
dcbf 0,r3
addi r3,r3,0x0020
bdnz 1b
sync
/* Ok, we are now running with the kernel data of the old *kernelfullyrestored.Wecangettothesavearea *easilynow.Asfortherestofthecode,itassumesthe *loaderkernelandthebootedoneareexactlyidentical
*/
lis r11,swsusp_save_area@h
ori r11,r11,swsusp_save_area@l
tophys(r11,r11)
#if 0 /* Restore various CPU config stuffs */
bl __restore_cpu_setup
#endif /* Restore the BATs, and SDR1. Then we can turn on the MMU. *ThisisabithairyaswearerunningoutofthoseBATs, *butfirst,ourcodeisprobablyintheicache,andweare *writingthesamevaluetotheBAT,sothatshouldbefine, *thoughabettersolutionwillhavetobefoundlong-term
*/
lwz r4,SL_SDR1(r11)
mtsdr1 r4
lwz r4,SL_SPRG0(r11)
mtsprg 0,r4
lwz r4,SL_SPRG0+4(r11)
mtsprg 1,r4
lwz r4,SL_SPRG0+8(r11)
mtsprg 2,r4
lwz r4,SL_SPRG0+12(r11)
mtsprg 3,r4
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.