Fixed bug with user_mem_assert in sparc
authorROS Developer <ros-dev@core0.(none)>
Tue, 29 Sep 2009 04:33:50 +0000 (06:33 +0200)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 1 Oct 2009 20:09:52 +0000 (22:09 +0200)
kern/arch/sparc/cpuinfo.c
kern/arch/sparc/mmu.h
kern/arch/sparc/pmap.c
kern/arch/sparc/process.c
kern/src/syscall.c

index 865cb29..6599a24 100644 (file)
@@ -74,7 +74,7 @@ void show_mapping(uintptr_t start, size_t size)
                {
                        cprintf("%08p  %1d %1d %1d  %1x  %1d\n",page2pa(page),
                                !!(*pte & PTE_C),!!(*pte & PTE_M),
-                               !!(*pte & PTE_R),PTE_ACC(*pte),
+                               !!(*pte & PTE_R),(*pte & PTE_ACC) >> 2,
                                !!(*pte & PTE_PTE));
                }
                else
index d172c6a..3ba0c84 100644 (file)
@@ -74,6 +74,7 @@
 // Page table/directory entry flags.
 #define PTE_PTD                0x001   // Entry is a Page Table Descriptor
 #define PTE_PTE                0x002   // Entry is a Page Table Entry
+#define PTE_ACC                0x01C   // Access modes (aka permissions, see below)
 #define PTE_R          0x020   // Referenced
 #define PTE_M          0x040   // Modified
 #define PTE_C          0x080   // Cacheable
 #define PDX(la)                L1X(la)                 // for env stuff
 #define PTX(la)                L3X(la)                 // same
 
-#define PTE_ACC(PTE)   (((PTE) & 0x1C) >> 2)   // Access bits
-
-// based upon PTE and Supervisor bit, can I read/write/execute this page?
-#define PTE_RD(PTE,S)  (PTE_ACC(PTE) != 4 && (PTE_ACC(PTE) < 6 || (S)))
-#define PTE_WR(PTE,S)  ((PTE_ACC(PTE) & 0x1) && (PTE_ACC(PTE) < 4 || (S)))
-#define PTE_EX(PTE,S)  (PTE_ACC(PTE) == 4 || (PTE_ACC(PTE) & 0x2) && (PTE_ACC(PTE) < 4 || (S)))
-
 // +-----+-------------------+
 // |     |   Allowed Access  |
 // | ACC +------+------------+
index 1b9de1f..297afa3 100644 (file)
@@ -123,37 +123,14 @@ pgdir_walk(pde_t* l1pt, const void*SNT va, int create)
  * perms. */
 int get_va_perms(pde_t *pgdir, const void *SNT va)
 {
-       return (int)pgdir_walk(pgdir, va, 0);
+       pte_t* pte = pgdir_walk(pgdir, va, 0);
+       return pte == NULL ? 0 : (*pte & (PTE_ACC | PTE_PTE));
 }
-//SARAH TODO: add sparc code here
+
 void *get_free_va_range(pde_t *pgdir, uintptr_t addr, size_t len)
-{ 
-/*{TRUSTEDBLOCK
-        // want to make sure there aren't mappings already.  will need to do this
-        // later with zones, for when we lazily allocate memory
-
-        uintptr_t startaddr;
-
-        int npages = ROUNDUP(len, PGSIZE) / PGSIZE;
-
-        addr &= ~0xfff;
-        if (!addr)
-                // some sensible default.  can cache the previous value somewhere
-                addr = USTACKTOP - PGSIZE; // TODO: not looking down
-        startaddr = addr;
-        pte_t *pte = pgdir_walk(pgdir, (void*)addr, 0);
-        // what about jumbo pages?
-        // consider looping around, esp if we start from a cached spot
-        // don't map at pg 0, or below brk
-        // consider local memory ranges...
-
-       
-        first fit?
-        what if we have a sorted structure of what mem ranges are already in use?
-        */
-
-        return (void*)0xdeadbeef;
-//}
+{
+       // SARAH TODO
+       assert(0);
 }
 
 
index 5e3732f..8729a0f 100644 (file)
@@ -31,10 +31,7 @@ proc_init_trapframe(trapframe_t *tf)
         tf->tbr = (uint32_t)&trap_table;
 }
 
-
-
-//SARAH TODO: FILL in these functions
 void proc_set_tfcoreid(trapframe_t *tf, uint32_t id)
 {
-//     tf->tf_regs.reg_eax = id;
+       tf->gpr[8] = id;
 }
index c24afca..46f71e4 100644 (file)
@@ -296,7 +296,9 @@ static ssize_t sys_cputs(env_t* e, const char *DANGEROUS s, size_t len)
 {
        // Check that the user has permission to read memory [s, s+len).
        // Destroy the environment if not.
-    char *COUNT(len) _s = user_mem_assert(e, s, len, PTE_USER_RO);
+       pte_t* p = pgdir_walk(e->env_pgdir,s,0);
+       printk("%x %x\n",*p,PTE_USER_RO);
+       char *COUNT(len) _s = user_mem_assert(e, s, len, PTE_USER_RO);
 
        // Print the string supplied by the user.
        printk("%.*s", len, _s);