Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 30 Jul 2006 23:53:55 +0800
From:      "Intron" <mag@intron.ac>
To:        Divacky Roman <xdivac02@stud.fit.vutbr.cz>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: VM question related to faults
Message-ID:  <courier.44CCD613.0001443C@intron.ac>
In-Reply-To: <20060730105731.GA64955@stud.fit.vutbr.cz>
References:  <20060730105731.GA64955@stud.fit.vutbr.cz>

next in thread | previous in thread | raw e-mail | index | archive | help
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@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?courier.44CCD613.0001443C>