Add write-combining memory mapping mode (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 11 Mar 2016 19:40:39 +0000 (14:40 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 11 Mar 2016 21:41:00 +0000 (16:41 -0500)
Use PTE_WRITECOMB for PTEs if you're manually building a mapping.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/riscv/ros/mmu.h
kern/arch/x86/ros/mmu64.h
kern/include/mm.h
kern/src/mm.c

index 9bdcaab..e52100b 100644 (file)
@@ -98,7 +98,9 @@
 #define PTE_SR   0x200 // Supervisor Write permission
 #define PTE_PERM (PTE_SR | PTE_SW | PTE_SX | PTE_UR | PTE_UW | PTE_UX)
 #define PTE_PPN_SHIFT 13
+#warning "Review RISCV PTE_modes, like NOCACHE/WRITECOMB"
 #define PTE_NOCACHE    0 // PTE bits to turn off caching, if possible
+#define PTE_WRITECOMB  0 // PTE bits to turn on write-combining, if possible
 
 // commly used access modes
 
index 9490401..66d54e1 100644 (file)
@@ -277,6 +277,7 @@ typedef struct x86_pgdir {
 #define PTE_G                  0x100   /* Global Page */
 #define __PTE_JPAT             0x800   /* Jumbo PAT */
 #define PTE_NOCACHE            (__PTE_PWT | __PTE_PCD)
+#define PTE_WRITECOMB  (__PTE_PCD)
 
 /* Permissions fields and common access modes.  These should be read as 'just
  * kernel or user too' and 'RO or RW'.  USER_RO means read-only for everyone. */
index ef70f99..4ac5949 100644 (file)
@@ -84,4 +84,5 @@ int unmap_vmap_segment(uintptr_t vaddr, unsigned long num_pages);
 /* Helper wrappers, since no one will probably call the *_segment funcs */
 uintptr_t vmap_pmem(uintptr_t paddr, size_t nr_bytes);
 uintptr_t vmap_pmem_nocache(uintptr_t paddr, size_t nr_bytes);
+uintptr_t vmap_pmem_writecomb(uintptr_t paddr, size_t nr_bytes);
 int vunmap_vmem(uintptr_t vaddr, size_t nr_bytes);
index 7b7e542..e7355b5 100644 (file)
@@ -1222,6 +1222,11 @@ uintptr_t vmap_pmem_nocache(uintptr_t paddr, size_t nr_bytes)
        return vmap_pmem_flags(paddr, nr_bytes, PTE_NOCACHE);
 }
 
+uintptr_t vmap_pmem_writecomb(uintptr_t paddr, size_t nr_bytes)
+{
+       return vmap_pmem_flags(paddr, nr_bytes, PTE_WRITECOMB);
+}
+
 int vunmap_vmem(uintptr_t vaddr, size_t nr_bytes)
 {
        unsigned long nr_pages = ROUNDUP(nr_bytes, PGSIZE) >> PGSHIFT;