Adds prefetch hints
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 10 Feb 2015 17:58:43 +0000 (12:58 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sun, 1 Mar 2015 14:37:04 +0000 (09:37 -0500)
prefetch() for read / generic and prefetchw() for impending writes.

For some discussion on the differences of prefetchnta vs the other hints, check
out
http://coding.derkeiler.com/Archive/Assembler/comp.lang.asm.x86/2006-03/msg00154.html

kern/arch/riscv/arch.h
kern/arch/x86/arch.h

index 1cc31b2..a0e767a 100644 (file)
@@ -159,4 +159,12 @@ static __inline void reboot(void)
 
 extern void cpu_halt(void);
 
+static inline void prefetch(void *addr)
+{
+}
+
+static inline void prefetchw(void *addr)
+{
+}
+
 #endif /* !ROS_INC_ARCH_H */
index 9b8db75..d3dfea5 100644 (file)
@@ -33,6 +33,8 @@ static inline int irq_is_enabled(void) __attribute__((always_inline));
 static inline void cache_flush(void) __attribute__((always_inline));
 static inline void reboot(void)
               __attribute__((always_inline)) __attribute__((noreturn));
+static inline void prefetch(void *addr);
+static inline void prefetchw(void *addr);
 
 /* in trap.c */
 void send_ipi(uint32_t os_coreid, uint8_t vector);
@@ -170,6 +172,16 @@ static inline void reboot(void)
        while (1);
 }
 
+static inline void prefetch(void *addr)
+{
+       asm volatile("prefetchnta (%0)" : : "r"(addr));
+}
+
+static inline void prefetchw(void *addr)
+{
+       asm volatile("prefetchw (%0)" : : "r"(addr));
+}
+
 /* Guest VMs have a maximum physical address they can use.  Guest
  * physical addresses are mapped into this MCP 1:1, but limited to
  * this max address *in hardware*.  I.e., the MCP process can address
@@ -186,4 +198,5 @@ static inline uint64_t max_guest_pa(void)
 {
        return (1ULL<<40) - 1;
 }
+
 #endif /* !ROS_INC_ARCH_H */