Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Jan 2005 11:09:14 -0500
From:      David Schultz <das@FreeBSD.ORG>
To:        Jacques Fourie <jf@trispen.com>
Cc:        freebsd-hackers@FreeBSD.ORG
Subject:   Re: kernel vm question
Message-ID:  <20050127160914.GA72454@VARK.MIT.EDU>
In-Reply-To: <41F90140.3020705@trispen.com>

index | next in thread | previous in thread | raw e-mail

On Thu, Jan 27, 2005, Jacques Fourie wrote:
> Hi,
> 
> I have a kernel module with the following entry point :
> 
> static int test_modevent(module_t mod, int type, void *unused)
> {
>   int s;
>   unsigned char *p = NULL;
>   unsigned char v = 0x55;
> 
>   switch (type)
>     {
>     case MOD_LOAD:
>       p = (unsigned char *)ip_output;
> 
>       s = splhigh();
> 
>       v = p[0];                   /* Page fault without this line */
>       p[0] = v;
[...]
> If I remove the line "Page fault without this line" line, I get a page 
> fault when loading this module. This crash seems to be hardware as well 
> as version specific - I can not reproduce the crash on 4.8 but on one 
> particular piece of hardware it crashes consistently on 4.9 and 4.10.

When the line is there, the compiler is probably smart enough to
realize that 'x=y; y=x' is (usually) a no-op, so it optimizes away
both statements.  Otherwise, you get a page fault because you're
trying to write to a non-writable page (namely, one in the
kernel's code segment).  If you're trying to do what I think
you're trying to do, you need to poke around in the VM system and
adjust the protection bits in the page you want to write to.


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050127160914.GA72454>