VM question related to faults
Intron
mag at intron.ac
Sun Jul 30 15:53:59 UTC 2006
Divacky Roman wrote:
> hi,
>
> while working on SoC linuxolator project I am in a need of this:
>
> I need to do some operation on memory like mem1 = mem1 + mem2 etc.
> where the mem1/mem2 access can trigger fault. (memory not mapped or something)
>
> currently I solve this by using pcb_onfault. this must be done in asm (kib@
> told me) so currently the code looks like this:
>
> futex_fault:
> movl PCPU(CURPCB), %edx
> movl $0, PCB_ONFAULT(%edx)
> movl $-EFAULT, %eax
> ret
>
> /* int futex_xchgl(int oparg, caddr_t uaddr, int *oldval); */
> .globl futex_xchgl
> futex_xchgl:
> movl PCPU(CURPCB), %eax
> movl $futex_fault, PCB_ONFAULT(%eax)
> movl 4(%esp), %eax
> movl 8(%esp), %edx
>
> xchgl %eax, (%edx)
> movl 0xc(%esp), %edx
> movl %eax, (%edx)
> xorl %eax, %eax
>
> movl PCPU(CURPCB), %edx
> movl $0, PCB_ONFAULT(%edx)
> ret
>
> this is not very nice nor portable. I wonder if its possible to do something
> like this:
>
> LOCK_VM_SOMEHOW();
> if (!memory_accessible(mem1) || !memory_accessible(mem2))
> return EFAULT;
>
> mem1 = mem1 + mem2;
>
> UNLOCK_VM_SOMEHOW();
>
> if its possible - what is the LOCK_VM_SOMEHOW lock? and what is the
> memory_accessible() function?
>
> thnx for pointing me to the right directions
>
> roman
>
>
> ----------------------
> www.liberalnistrana.cz
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
As I know, there're two ways to detect page fault:
1. Look up in page mapping table (i.e. GDT and IDT on x86 or x86_64).
See copyin() and copyout() in "/sys/i386/i386/support.s".
2. Capture exception interrupt triggered by CPU (i.e. INT 0x0E on x86
and x86_64) like vm_fault() in "/sys/vm/vm_fault.c".
Actually, kernel memory page fault should not arise at all, which means
bug made by programmer.
------------------------------------------------------------------------
From Beijing, China
More information about the freebsd-hackers
mailing list