aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2021-03-29 16:38:48 -0700
committerAndrew Waterman <andrew@sifive.com>2021-03-29 16:38:48 -0700
commit96f98f0caac211ec8f7a573e7592212f674f7c81 (patch)
treeb13f99397017c6349562a00947ef3032f6495b55
parent75bbd1ecfac34ed20f88234872f66d7f670da4d2 (diff)
downloadriscv-pk-96f98f0caac211ec8f7a573e7592212f674f7c81.zip
riscv-pk-96f98f0caac211ec8f7a573e7592212f674f7c81.tar.gz
riscv-pk-96f98f0caac211ec8f7a573e7592212f674f7c81.tar.bz2
pk: correctly restore sstatus.SUM in strcpy_from_user
-rw-r--r--pk/usermem.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/pk/usermem.c b/pk/usermem.c
index b65e515..cfe6f06 100644
--- a/pk/usermem.c
+++ b/pk/usermem.c
@@ -43,6 +43,8 @@ void memcpy_from_user(void* dst, const void* src, size_t n)
bool strcpy_from_user(char* dst, const char* src, size_t n)
{
+ bool res = false;
+
uintptr_t sstatus = set_csr(sstatus, SSTATUS_SUM);
while (n > 0) {
@@ -52,8 +54,10 @@ bool strcpy_from_user(char* dst, const char* src, size_t n)
char ch = *(volatile const char*)src;
*dst = ch;
- if (ch == 0)
- return true;
+ if (ch == 0) {
+ res = true;
+ break;
+ }
src++;
dst++;
@@ -62,5 +66,5 @@ bool strcpy_from_user(char* dst, const char* src, size_t n)
write_csr(sstatus, sstatus);
- return false;
+ return res;
}