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