Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
4ec2e3db
提交
4ec2e3db
4月 01, 2012
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
uaccess clean up
上级
ae8f1bcf
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
65 行增加
和
68 行删除
+65
-68
kernel.hh
include/kernel.hh
+3
-3
net.cc
kernel/net.cc
+5
-5
syscall.cc
kernel/syscall.cc
+22
-42
trap.cc
kernel/trap.cc
+2
-2
uaccess.S
kernel/uaccess.S
+33
-16
没有找到文件。
include/kernel.hh
浏览文件 @
4ec2e3db
...
...
@@ -205,9 +205,9 @@ void release(struct spinlock*);
int
argcheckptr
(
void
*
argval
,
int
);
int
argcheckstr
(
const
char
*
);
int
fetchint64
(
uptr
,
u64
*
);
int
fetchstr
(
char
*
,
const
char
*
,
u
nsigned
);
int
umemcpy
(
void
*
,
void
*
,
u64
);
int
kmemcpy
(
void
*
,
void
*
,
u64
);
int
fetchstr
(
char
*
,
const
char
*
,
u
64
);
int
fetchmem
(
void
*
,
const
void
*
,
u64
);
int
putmem
(
void
*
,
const
void
*
,
u64
);
u64
syscall
(
u64
a0
,
u64
a1
,
u64
a2
,
u64
a3
,
u64
a4
,
u64
num
);
// string.c
...
...
kernel/net.cc
浏览文件 @
4ec2e3db
...
...
@@ -282,7 +282,7 @@ netbind(int sock, void *xaddr, int xaddrlen)
if
(
addr
==
nullptr
)
return
-
1
;
if
(
umemcpy
(
addr
,
xaddr
,
xaddrlen
))
if
(
fetchmem
(
addr
,
xaddr
,
xaddrlen
))
return
-
1
;
lwip_core_lock
();
...
...
@@ -311,7 +311,7 @@ netaccept(int sock, void *xaddr, void *xaddrlen)
void
*
addr
;
int
ss
;
if
(
umemcpy
(
&
len
,
lenptr
,
sizeof
(
*
lenptr
)))
if
(
fetchmem
(
&
len
,
lenptr
,
sizeof
(
*
lenptr
)))
return
-
1
;
addr
=
kmalloc
(
len
,
"sockaddr"
);
...
...
@@ -326,7 +326,7 @@ netaccept(int sock, void *xaddr, void *xaddrlen)
return
ss
;
}
if
(
kmemcpy
(
xaddrlen
,
&
len
,
sizeof
(
len
))
||
kmemcpy
(
xaddr
,
addr
,
len
))
{
if
(
putmem
(
xaddrlen
,
&
len
,
sizeof
(
len
))
||
putmem
(
xaddr
,
addr
,
len
))
{
lwip_core_lock
();
lwip_close
(
ss
);
lwip_core_unlock
();
...
...
@@ -357,7 +357,7 @@ netwrite(int sock, char *ubuf, int len)
return
-
1
;
cc
=
MIN
(
len
,
PGSIZE
);
if
(
umemcpy
(
kbuf
,
ubuf
,
cc
))
{
if
(
fetchmem
(
kbuf
,
ubuf
,
cc
))
{
kfree
(
kbuf
);
return
-
1
;
}
...
...
@@ -388,7 +388,7 @@ netread(int sock, char *ubuf, int len)
return
r
;
}
kmemcpy
(
ubuf
,
kbuf
,
r
);
putmem
(
ubuf
,
kbuf
,
r
);
kfree
(
kbuf
);
return
r
;
}
...
...
kernel/syscall.cc
浏览文件 @
4ec2e3db
...
...
@@ -10,15 +10,32 @@
#include "cpu.hh"
#include "kmtrace.hh"
extern
"C"
int
__fetchstr
(
char
*
dst
,
const
char
*
usrc
,
unsigned
size
);
extern
"C"
int
__fetchint64
(
uptr
addr
,
u64
*
ip
);
extern
"C"
int
__uaccess_mem
(
void
*
dst
,
const
void
*
src
,
u64
size
);
extern
"C"
int
__uaccess_str
(
char
*
dst
,
const
char
*
src
,
u64
size
);
extern
"C"
int
__uaccess_int64
(
uptr
addr
,
u64
*
ip
);
int
fetch
str
(
char
*
dst
,
const
char
*
usrc
,
unsigned
size
)
fetch
mem
(
void
*
dst
,
const
void
*
usrc
,
u64
size
)
{
if
(
mycpu
()
->
ncli
!=
0
)
panic
(
"fetchstr: cli'd"
);
return
__fetchstr
(
dst
,
usrc
,
size
);
return
__uaccess_mem
(
dst
,
usrc
,
size
);
}
int
putmem
(
void
*
udst
,
const
void
*
src
,
u64
size
)
{
if
(
mycpu
()
->
ncli
!=
0
)
panic
(
"fetchstr: cli'd"
);
return
__uaccess_mem
(
udst
,
src
,
size
);
}
int
fetchstr
(
char
*
dst
,
const
char
*
usrc
,
u64
size
)
{
if
(
mycpu
()
->
ncli
!=
0
)
panic
(
"fetchstr: cli'd"
);
return
__uaccess_str
(
dst
,
usrc
,
size
);
}
int
...
...
@@ -26,7 +43,7 @@ fetchint64(uptr addr, u64 *ip)
{
if
(
mycpu
()
->
ncli
!=
0
)
panic
(
"fetchstr: cli'd"
);
return
__
fetch
int64
(
addr
,
ip
);
return
__
uaccess_
int64
(
addr
,
ip
);
}
// Fetch the nul-terminated string at addr from process p.
...
...
@@ -60,43 +77,6 @@ argcheckptr(void *p, int size)
return
0
;
}
static
int
umemptr
(
void
*
umem
,
void
**
ret
,
u64
size
)
{
uptr
ptr
=
(
uptr
)
umem
;
for
(
uptr
va
=
PGROUNDDOWN
(
ptr
);
va
<
ptr
+
size
;
va
=
va
+
PGSIZE
)
if
(
pagefault
(
myproc
()
->
vmap
,
va
,
0
)
<
0
)
return
-
1
;
*
ret
=
umem
;
return
0
;
}
int
umemcpy
(
void
*
dst
,
void
*
umem
,
u64
size
)
{
void
*
ptr
;
if
(
umemptr
(
umem
,
&
ptr
,
size
))
return
-
1
;
memmove
(
dst
,
ptr
,
size
);
return
0
;
}
int
kmemcpy
(
void
*
umem
,
void
*
src
,
u64
size
)
{
void
*
ptr
;
if
(
umemptr
(
umem
,
&
ptr
,
size
))
return
-
1
;
memmove
(
ptr
,
src
,
size
);
return
0
;
}
u64
syscall
(
u64
a0
,
u64
a1
,
u64
a2
,
u64
a3
,
u64
a4
,
u64
num
)
{
...
...
kernel/trap.cc
浏览文件 @
4ec2e3db
...
...
@@ -12,7 +12,7 @@
#include "bits.hh"
#include "kalloc.hh"
extern
"C"
void
__
fetch
_end
(
void
);
extern
"C"
void
__
uaccess
_end
(
void
);
struct
intdesc
idt
[
256
]
__attribute__
((
aligned
(
16
)));
...
...
@@ -60,7 +60,7 @@ do_pagefault(struct trapframe *tf)
}
cprintf
(
"pagefault: failed in kernel
\n
"
);
tf
->
rax
=
-
1
;
tf
->
rip
=
(
u64
)
__
fetch
_end
;
tf
->
rip
=
(
u64
)
__
uaccess
_end
;
return
0
;
}
else
if
(
tf
->
err
&
FEC_U
)
{
sti
();
...
...
kernel/uaccess.S
浏览文件 @
4ec2e3db
#include "mmu.h"
#include "asmdefines.h"
#define ENTRY(name) .globl name ; .align 8; name :
// We aren't allowed to touch rbx,rsp,rbp,r12-r15
.code64
.globl __fetchint64
.align 8
// rdi user src
// rsi kernel dst
// We aren't allowed to touch rbx,rsp,rbp,r12-r15
__fetchint64:
ENTRY(__uaccess_int64)
mov %gs:0x8, %r11
movl $1, PROC_UACCESS(%r11)
mov (%rdi), %r10
mov %r10, (%rsi)
mov $0, %rax
jmp __fetch_end
.globl __fetchstr
.align 8
// rdi kernel dst
// rsi user src
// rdx kernel len
// We aren't allowed to touch rbx,rsp,rbp,r12-r15
__fetchstr:
jmp __uaccess_end
// rdi dst
// rsi src
// rdx dst len
ENTRY(__uaccess_str)
mov %gs:0x8, %r11
movl $1, PROC_UACCESS(%r11)
...
...
@@ -40,11 +38,30 @@ __fetchstr:
// Error
movq $-1, %rax
2: // Done
jmp __fetch_end
jmp __uaccess_end
// rdi dst
// rsi src
// rdx len
ENTRY(__uaccess_mem)
mov %gs:0x8, %r11
movl $1, PROC_UACCESS(%r11)
.globl __fetch_end
// %rcx is loop instruction counter
mov %rdx, %rcx
xor %rax, %rax
1:
movb (%rsi), %r10b
movb %r10b, (%rdi)
inc %rdi
inc %rsi
loop 1b
// Done
jmp __uaccess_end
.globl __uaccess_end
.align 8
__
fetch
_end:
__
uaccess
_end:
movl $0, PROC_UACCESS(%r11)
ret
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论