Adds sys_getcpuid and sys_cache_invalidate
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 22 May 2009 07:33:57 +0000 (00:33 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Tue, 26 May 2009 04:58:24 +0000 (21:58 -0700)
include/ros/syscall.h
kern/src/syscall.c
user/roslib/inc/lib.h
user/roslib/inc/null.h
user/roslib/src/null.c
user/roslib/src/syscall.c

index aad2fe5..ee9c838 100644 (file)
@@ -10,9 +10,11 @@ enum
 {
        SYS_null = 1,
        SYS_cache_buster,
+       SYS_cache_invalidate,
        SYS_cputs,
        SYS_cgetc,
        SYS_getenvid,
+       SYS_getcpuid,
        SYS_env_destroy,
 };
 #define NSYSCALLS (SYS_env_destroy)
index bec0ade..5fe4521 100644 (file)
@@ -30,11 +30,18 @@ void syscall_wrapper(struct Trapframe *tf)
 }
 
 //Do absolutely nothing.  Used for profiling.
-static void sys_null(env_t* e)
+static void sys_null(void)
 {
        return;
 }
 
+// Invalidate the cache of this core
+static void sys_cache_invalidate(void)
+{
+       wbinvd();
+       return;
+}
+
 // Writes 'val' to 'num_writes' entries of the well-known array in the kernel
 // address space.  It's just #defined to be some random 4MB chunk (which ought
 // to be boot_alloced or something).  Meant to grab exclusive access to cache
@@ -88,6 +95,12 @@ sys_getenvid(env_t* e)
        return e->env_id;
 }
 
+// Returns the id of the cpu this syscall is executed on.
+static envid_t sys_getcpuid(void)
+{
+       return lapic_get_id();
+}
+
 // Destroy a given environment (possibly the currently running environment).
 //
 // Returns 0 on success, < 0 on error.  Errors are:
@@ -126,7 +139,10 @@ int32_t syscall(env_t* e, uint32_t syscallno, uint32_t a1, uint32_t a2,
 
        switch (syscallno) {
                case SYS_null:
-                       sys_null(e);
+                       sys_null();
+                       return 0;
+               case SYS_cache_invalidate:
+                       sys_cache_invalidate();
                        return 0;
                case SYS_cache_buster:
                        sys_cache_buster(e, a1, a2);
@@ -138,6 +154,8 @@ int32_t syscall(env_t* e, uint32_t syscallno, uint32_t a1, uint32_t a2,
                        return sys_cgetc(e);
                case SYS_getenvid:
                        return sys_getenvid(e);
+               case SYS_getcpuid:
+                       return sys_getcpuid();
                case SYS_env_destroy:
                        return sys_env_destroy(e, (envid_t)a1);
                default:
index 63072c9..876434a 100644 (file)
@@ -34,18 +34,20 @@ void exit(void) __attribute__((noreturn));
 char*  readline(const char *buf);
 
 // syscall.c
-void sys_null();
-error_t sys_null_async(syscall_desc_t* desc);
-void sys_cache_buster(uint32_t num_writes, uint32_t val);
-error_t sys_cache_buster_async(syscall_desc_t* desc, uint32_t num_writes,
-                               uint32_t val);
-void sys_cputs(const char *string, size_t len);
-error_t sys_cputs_async(const char *s, size_t len, syscall_desc_t* desc,
-                     void (*cleanup_handler)(void*), void* cleanup_data);
-int    sys_cgetc(void);
-envid_t        sys_getenvid(void);
-int    sys_env_destroy(envid_t);
-error_t waiton_syscall(syscall_desc_t* desc, syscall_rsp_t* rsp);
+void           sys_null();
+error_t                sys_null_async(syscall_desc_t* desc);
+void           sys_cache_invalidate();
+void           sys_cache_buster(uint32_t num_writes, uint32_t val);
+error_t                sys_cache_buster_async(syscall_desc_t* desc, uint32_t num_writes,
+                                              uint32_t val);
+void           sys_cputs(const char *string, size_t len);
+error_t                sys_cputs_async(const char *s, size_t len, syscall_desc_t* desc,
+                                       void (*cleanup_handler)(void*), void* cleanup_data);
+int                    sys_cgetc(void);
+envid_t                sys_getenvid(void);
+uint32_t       sys_getcpuid(void);
+int                    sys_env_destroy(envid_t);
+error_t                waiton_syscall(syscall_desc_t* desc, syscall_rsp_t* rsp);
 
 // async callback
 #define MAX_SYSCALLS 100
index 0665096..7e1f763 100644 (file)
@@ -6,5 +6,6 @@ error_t null_async(async_desc_t** desc);
 void cache_buster(uint32_t num_writes, uint32_t val);
 error_t cache_buster_async(async_desc_t** desc, uint32_t num_writes,
                            uint32_t val);
+uint32_t getcpuid(void);
 
 #endif // ROS_INC_NULL_H
index 045e157..140c223 100644 (file)
@@ -33,3 +33,8 @@ error_t cache_buster_async(async_desc_t** desc, uint32_t num_writes, uint32_t va
                return e;
        return sys_cache_buster_async(sysdesc, num_writes, val);
 }
+
+uint32_t getcpuid(void)
+{
+       return sys_getcpuid();
+}
index 15e710b..a09e7ae 100644 (file)
@@ -34,6 +34,7 @@ syscall_sysenter(int num, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, ui
         : "cc", "memory", "%esp");
        return ret;
 }
+
 static inline uint32_t
 syscall_trap(int num, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5)
 {
@@ -65,13 +66,13 @@ syscall_trap(int num, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32
        return ret;
 }
 
-static inline uint32_t
-syscall(int num, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5)
+static inline uint32_t syscall(int num, uint32_t a1, uint32_t a2, uint32_t a3,
+                               uint32_t a4, uint32_t a5)
 {
        #ifndef SYSCALL_TRAP
-       return syscall_sysenter(num, a1, a2, a3, a4, a5);
+               return syscall_sysenter(num, a1, a2, a3, a4, a5);
        #else
-       return syscall_trap(num, a1, a2, a3, a4, a5);
+               return syscall_trap(num, a1, a2, a3, a4, a5);
        #endif
 }
 
@@ -157,6 +158,11 @@ void sys_null()
        syscall(SYS_null,0,0,0,0,0);
 }
 
+void sys_cache_invalidate()
+{
+       syscall(SYS_cache_invalidate, 0, 0, 0, 0, 0);
+}
+
 void
 sys_cputs(const char *s, size_t len)
 {
@@ -181,4 +187,9 @@ sys_getenvid(void)
         return syscall(SYS_getenvid, 0, 0, 0, 0, 0);
 }
 
+uint32_t sys_getcpuid(void)
+{
+        return syscall(SYS_getcpuid, 0, 0, 0, 0, 0);
+}
+