<div dir="ltr">In this case, have you tried reading and writing to the memory segment being mmap&#39;d from userland? <br><br>Here&#39;s an example mmap&#39;ing device driver if you need to see that:<br><a href="https://github.com/claudioscordino/mmap_alloc">https://github.com/claudioscordino/mmap_alloc</a><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 12, 2016 at 6:10 PM, Jethro Beekman <span dir="ltr">&lt;<a href="mailto:kernel@jbeekman.nl" target="_blank">kernel@jbeekman.nl</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I&#39;m writing a device driver for a memory-mapped device on x86-64. I&#39;m mapping<br>
the device in the kernel using ioremap_cache(). My file_operations.mmap function<br>
is as follows:<br>
<br>
static int dev_mmap(struct file *filep, struct vm_area_struct *vma) {<br>
        vma-&gt;vm_page_prot.pgprot|=_PAGE_BIT_RW;<br>
        return vm_iomap_memory(vma,START,LEN);<br>
}<br>
<br>
The user process calls mmap(..,PROT_READ|PROT_WRITE|PROT_EXEC,..). The mapping<br>
in /proc/[pid]/maps shows the write bit. However, when looking at the actual<br>
page table entry does not have the RW bit set. For example:<br>
<br>
virtual address = 0000_0001_8000_0000<br>
cr3 = 0000_0000_700a_e000<br>
phys:0000_0000_700a_e000 = 0000_0000_7e05_5067 (P|RW|US|A|D)<br>
phys:0000_0000_7e05_5030 = 0000_0001_66e2_9067 (P|RW|US|A|D)<br>
phys:0000_0001_66e2_9000 = 0000_0001_69db_3067 (P|RW|US|A|D)<br>
phys:0000_0001_69db_3000 = 0000_0000_8020_0225 (P|US|A|SOFTW1)<br>
<br>
Am I doing something wrong?<br>
<br>
Jethro<br>
<br>
_______________________________________________<br>
Kernelnewbies mailing list<br>
<a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
<a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" rel="noreferrer" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
</blockquote></div><br></div>