On Monday 22 October 2007 16:04:14, Benjamin Herrenschmidt wrote: > > Yup, I've found how does the kernel handle tlbs, I think the most > > important thing is I forgot read/write the SPRN_SPRG3 register as _switch > > does. > > SPRG3 is for use by the operating system for whatever you want... if you > are copying linux code, then you probably indeed want to get that right > but you don't have to use SPRG3. > > > I've add the _PAGE_PRESENT flag to the related PTE > > Hrm.. that has nothing ot do with the PTE. Bolting is more a property of > your replacement algorithm in the TLB miss handler. > > Ben.
Hi, First thanks a lot for your help I've finish the tlb code, now I can manually translate the virtual address correctly, I verified this by printing out the data within the virtual address and it's fine. now the only thing left is jump to that address (the address is point to _start function), But I got an error about unable to access the stack (0xd100fc60 ...), but it is valid before the instruction: /** * XXX: should not defined here */ #define EVENTS_USER_ADDR_OFFSET 36 _GLOBAL(jump_xm_dom) stwu r1,-INT_FRAME_SIZE(r1) mflr r0 stw r0,INT_FRAME_SIZE+4(r1) stw r31,INT_FRAME_SIZE+128(r1) lwz r5,EVENTS_USER_ADDR_OFFSET(r4) mr r31,r5 /* new_domain->events_user_addr */ cmpwi r3,0 beq 1f mtctr r3 /* jump to entry_point */ bctrl li r3,0 1: lwz r31,INT_FRAME_SIZE+128(r1) lwz r0,INT_FRAME_SIZE+4(r1) addi r1,r1,INT_FRAME_SIZE mtlr r0 blr the SP is valid before `bctrl', while exec bctrl, I got the error said unable to access address SP ($r1) from bdigdb, without bdigbd (running directly), an error is print out while the system is dead: insn: 94 21 ff 40 7c 08 02 a6 90 01 00 c4 7f e3 fb 78 3d 20 10 01 90 69 07 a0 48 00 02 55 80 01 00 c4 $T0440:10000094;01:d1072e60;#ee address d1072e60 is the address of SP ($r1) before bctrl. NOTE entry_point($r3) is address like 0x100000a0 which is loaded from the userspace by a loader program (it loads all section marked as PT_LOAD, such as .text, the above insn is the entry of .text section, which is _start), but the above code is from the kernel space. and here is the _start function: #define INT_FRAME_SIZE 192 .globl _start _start: stwu 1, -INT_FRAME_SIZE(1) mflr 0 stw 0, INT_FRAME_SIZE+4(1) mr 3,31 /* new_domain->events_user_addr */ lis 9, [EMAIL PROTECTED] stw 3, [EMAIL PROTECTED](9) bl kmain lwz 0, INT_FRAME_SIZE+4(1); mtlr 0 addi 1, 1, INT_FRAME_SIZE blr .size _start, .-_start I'm sorry I'm not very familiar with the ppc assembly, is there something fundamentally wrong? Thank you very much! Regards, Wang -- Wang, Baojun Lanzhou University Distributed & Embedded System Lab http://dslab.lzu.edu.cn School of Information Science and Engeneering [EMAIL PROTECTED] Tianshui South Road 222. Lanzhou 730000 .P.R.China Tel:+86-931-8912025 Fax:+86-931-8912022
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev