How to avoid kernel Oops 0x81F in function do_alignment() ?
Hi experts: an user application generates a un-alignment data abort, then in function do_alignment, kernel read the instruction from the address where data abort occurs by: fault = __get_user(instr, (u32 *)instrptr); after this sentence, instr is the error instruction that generate data abort. i change this instruction from strict alignment check instruction to not strict alignmentcheck instruction by: instr = instr&030; at last i write this instruction back to ram, and let cpu execute this instruction again: *((u32*)instrptr) = instr; it works on kernel 2.6.35, but on version 3.0, it failed, the last sentence above generates a Oops: [ 58.966552] Unable to handle kernel paging request at virtual address 000084ec [ 58.974029] pgd = db9f4000 [ 58.976806] [000084ec] *pgd=1b9db831, *pte=0ae5f59f, *ppte=0ae5fe7e [ 58.986877] Internal error: Oops: 81f [#1] PREEMPT SMP 1. it seems that kernel 3.0 can not modify user mode program instructions directly even underSVC mode. 2. how can i change the page permisson before write back instruction of user mode application? for example, find out the page tables of current application, find out the pte which representsthe instruction that generate data abort, then modify pte, write back instruction, restore pte, done. how to do these? please advise, thanks very much. Best Regards
Hi,
2. how can i change the page permisson before write back instruction of user mode application? for example, find out the page tables of current application, find out the pte which represents the instruction that generate data abort, then modify pte, write back instruction, restore pte, done. how to do these?
I think you can get the pgd of this process by current->mm->pgd and pgd_offset macro to ge the pgd entry for that address. There are macros available for accessing pmd and pte too. For example pte_offset_map for pte and a locking version for the same is also there. I don't have any hands on experience on this, so our kernel experts can comment on this more. And one more thing, if you can look at the function handle_mm_fault (mm/memory.c), there are plenty of refererces for accesing these page table entries. With Regards, Subin K G
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
-- With Regards Subin Gangadharan I am not afraid and I am also not afraid of being afraid.
hi subin: Thanks,I have solved this issue, the Method looks the same as you mentioned. 在 2012-3-14,11:12,"subin gangadharan" <subingangadharan@gmail.com> 写道:
Hi,
2. how can i change the page permisson before write back instruction of user mode application? for example, find out the page tables of current application, find out the pte which represents the instruction that generate data abort, then modify pte, write back instruction, restore pte, done. how to do these?
I think you can get the pgd of this process by current->mm->pgd and pgd_offset macro to ge the pgd entry for that address. There are macros available for accessing pmd and pte too. For example pte_offset_map for pte and a locking version for the same is also there. I don't have any hands on experience on this, so our kernel experts can comment on this more.
And one more thing, if you can look at the function handle_mm_fault (mm/memory.c), there are plenty of refererces for accesing these page table entries.
With Regards, Subin K G
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
-- With Regards Subin Gangadharan
I am not afraid and I am also not afraid of being afraid.
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
participants (3)
-
subin gangadharan -
卜弋天 -
弋天 卜