From 9c1b8a4eb085d7c639c2039fc14beba83d95653e Mon Sep 17 00:00:00 2001
From: Robert Morris <rtm@csail.mit.edu>
Date: Wed, 24 Aug 2022 13:24:24 -0400
Subject: [PATCH] sfence before writing satp, as well as after

---
 kernel/fs.c         | 2 +-
 kernel/trampoline.S | 2 ++
 user/grind.c        | 5 +++--
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/kernel/fs.c b/kernel/fs.c
index dea5864..c6bab15 100644
--- a/kernel/fs.c
+++ b/kernel/fs.c
@@ -194,7 +194,7 @@ static struct inode* iget(uint dev, uint inum);
 // Allocate an inode on device dev.
 // Mark it as allocated by  giving it type type.
 // Returns an unlocked but allocated and referenced inode,
-// or NULL if there is no free inode..
+// or NULL if there is no free inode.
 struct inode*
 ialloc(uint dev, short type)
 {
diff --git a/kernel/trampoline.S b/kernel/trampoline.S
index 0aaa413..7fb0b36 100644
--- a/kernel/trampoline.S
+++ b/kernel/trampoline.S
@@ -82,6 +82,7 @@ uservec:
 
         # load the kernel page table, from p->trapframe->kernel_satp
         ld t1, 0(a0)
+        sfence.vma zero, zero
         csrw satp, t1
         sfence.vma zero, zero
 
@@ -96,6 +97,7 @@ userret:
         # a0: user page table, for satp.
 
         # switch to the user page table.
+        sfence.vma zero, zero
         csrw satp, a0
         sfence.vma zero, zero
 
diff --git a/user/grind.c b/user/grind.c
index 5cd89f4..431ed19 100644
--- a/user/grind.c
+++ b/user/grind.c
@@ -305,7 +305,7 @@ iter()
     exit(1);
   }
   if(pid1 == 0){
-    rand_next = 31;
+    rand_next ^= 31;
     go(0);
     exit(0);
   }
@@ -316,7 +316,7 @@ iter()
     exit(1);
   }
   if(pid2 == 0){
-    rand_next = 7177;
+    rand_next ^= 7177;
     go(1);
     exit(0);
   }
@@ -346,5 +346,6 @@ main()
       wait(0);
     }
     sleep(20);
+    rand_next += 1;
   }
 }