tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Help with a bug in mmap
> Date: Wed, 31 Oct 2018 22:01:14 +0530
> From: Siddharth Muralee <siddharth.muralee%gmail.com@localhost>
>
> Hello All,
> I have recently been working on porting the kcov(4) feature to NetBSD.
> The feature comes as a /dev module. I have been stuck for a while with the
> mmap() function of the device. I have been trying to populate a buffer from
> the module and then pass it to the userspace program.
>
> The mmap function of the device is here
> <https://github.com/R3x/src/blob/32806c3abfcfb5e82d1a0c69e00749ef97fdaf21/sys/dev/kcov.c#L205>
> and the function populating the buffer is here
> <https://github.com/R3x/src/blob/32806c3abfcfb5e82d1a0c69e00749ef97fdaf21/sys/dev/kcov.c#L86>
There is no MI API for turning a paddr or kva into a pmap mmap cookie,
which is what the struct cdev::d_mmap routine is supposed to return.
For bus space, there's bus_space_mmap; for bus DMA buffers, there's
bus_dmamem_mmap; but nothing that takes an arbitrary paddr or kva.
The pmap_phys_address and pmap_mmap_flags functions _take_ a pmap mmap
cookie and turn them into a physical address and a set of flags, but
that's the reverse.
For the moment, as a provisional workaround to make progress, you can
probably get by with `pa << PGSHIFT', where pa is the physical (byte)
address of the page you want -- but make sure to add a big scary XXX
comment saying that this is not right and needs to be fixed.
Beware that you'll also have to pmap_page_protect(PROT_NONE) all
physical addresses in the uvm_km buffer before you can uvm_km_free,
too. Not sure offhand whether this might have a bad interaction with
uvm_km_free(UVM_KMF_WIRED), so be careful!
Home |
Main Index |
Thread Index |
Old Index