Hi,
when playing with the new module framework, I tried to load/unload
the example module. Loading works like a charm, but when unloading
the module, the system panics with an assertion failure in
uvm_km_pgremove_intrsafe at line 473, i.e. the
KASSERT(end <= VM_MAX_KERNEL_ADDRESS);
I tracked it down to the fact that VM_MAX_KERNEL_ADDRESS is
defined (in sys/arch/amd64/include/vmparam.h) as 0xffffff8000000000.
At the same time the lkm_map (which is used to map modules) is
allocated in sys/arch/amd64/amd64/machdep.c just beyond the kernel
itself (probably in order to be able to use short(er?) calls from
the module into the kernel). The kernel virtual space starts at
KERNBASE, defined (in sys/arch/amd64/include/param.h) as
0xffffffff80000000. This results in the lkm_map not being part
of the kernel_map, which then leads to the assertion failure
observed.
So the question is, why is VM_MAX_KERNEL_ADDRESS defined this low,
so that the "kernel virtual space", i.e. KERNBASE, is not within
(VM_MIN_KERNEL_ADDRESS, KERN_MAX_KERNEL_ADDRESS(?

The kernel virtual space is determined by the -cmodel=kernel compile
flags, that put it in the 4T-2G region. lkm_map is indeed located where
it is to be able to link modules compiled with the same flags (the issue
is %rip-relative addressing). Therefore, KERNBASE is 0xffffffff80000000
(4T-2G).

The total address space that is available to pick kernel data space from
is 0xffffff8000000000 - KERNBASE. However, that's a very large range,
and some kernel data structures blew up when I configured the kernel for
the whole range. Also, I ran into some assumptions that only the lower
end of the kernel space can be pre-allocated by e.g. kernel text, not
the upper part, which would need to be the case for amd64.

So I just used a more limited range at the lower end of the available
space.

I don't know if the data structure limitations and code assumptions are
still there, perhaps they aren't anymore.

Ok, thanks for the explamation.>
So, what should we do about this? For now, I simply commented the assertion
in uvm_km.c in my tree (yes, I'm compiling with DIAGNOSTIC defined.)
BTW, in order to be able to use kernel modules, they have to be compiled with
-mno-red-zone, just like the kernel. AFAIU the way to go here is to create a
src/sys/arch/amd64/include/Makefile.inc with "CFLAGS+=-mno-read-zone" in it.
Or is it better to add it to src/share/mk/bsd.klinks.mk, where -mcmodel=kernel
is already added to CFLAGS?
Comments?
Ciao,
Wolfgang
--
Wolfgang%Solfrank.net@localhost