syscall lab finished
This commit is contained in:
164
user/sysinfotest.c
Normal file
164
user/sysinfotest.c
Normal file
@@ -0,0 +1,164 @@
|
||||
#include "kernel/types.h"
|
||||
#include "kernel/riscv.h"
|
||||
/*#include "kernel/sysinfo.h"*/
|
||||
#include "user/user.h"
|
||||
|
||||
|
||||
void
|
||||
sinfo(struct sysinfo *info) {
|
||||
if (sysinfo(info) < 0) {
|
||||
printf("FAIL: sysinfo failed");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// use sbrk() to count how many free physical memory pages there are.
|
||||
//
|
||||
int
|
||||
countfree()
|
||||
{
|
||||
uint64 sz0 = (uint64)sbrk(0);
|
||||
struct sysinfo info;
|
||||
int n = 0;
|
||||
|
||||
while(1){
|
||||
if((uint64)sbrk(PGSIZE) == 0xffffffffffffffff){
|
||||
break;
|
||||
}
|
||||
n += PGSIZE;
|
||||
}
|
||||
sinfo(&info);
|
||||
if (info.freemem != 0) {
|
||||
printf("FAIL: there is no free mem, but sysinfo.freemem=%d\n",
|
||||
info.freemem);
|
||||
exit(1);
|
||||
}
|
||||
sbrk(-((uint64)sbrk(0) - sz0));
|
||||
return n;
|
||||
}
|
||||
|
||||
void
|
||||
testmem() {
|
||||
struct sysinfo info;
|
||||
uint64 n = countfree();
|
||||
|
||||
sinfo(&info);
|
||||
|
||||
if (info.freemem!= n) {
|
||||
printf("FAIL: free mem %d (bytes) instead of %d\n", info.freemem, n);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if((uint64)sbrk(PGSIZE) == 0xffffffffffffffff){
|
||||
printf("sbrk failed");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
sinfo(&info);
|
||||
|
||||
if (info.freemem != n-PGSIZE) {
|
||||
printf("FAIL: free mem %d (bytes) instead of %d\n", n-PGSIZE, info.freemem);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if((uint64)sbrk(-PGSIZE) == 0xffffffffffffffff){
|
||||
printf("sbrk failed");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
sinfo(&info);
|
||||
|
||||
if (info.freemem != n) {
|
||||
printf("FAIL: free mem %d (bytes) instead of %d\n", n, info.freemem);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
testcall() {
|
||||
struct sysinfo info;
|
||||
|
||||
if (sysinfo(&info) < 0) {
|
||||
printf("FAIL: sysinfo failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (sysinfo((struct sysinfo *) 0xeaeb0b5b00002f5e) != 0xffffffffffffffff) {
|
||||
printf("FAIL: sysinfo succeeded with bad argument\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
void testproc() {
|
||||
struct sysinfo info;
|
||||
uint64 nproc, unused_proc_num;
|
||||
int status;
|
||||
int pid;
|
||||
|
||||
sinfo(&info);
|
||||
nproc = info.nproc;
|
||||
unused_proc_num = info.unused_proc_num;
|
||||
|
||||
pid = fork();
|
||||
if(pid < 0){
|
||||
printf("sysinfotest: fork failed\n");
|
||||
exit(1);
|
||||
}
|
||||
if(pid == 0){
|
||||
sinfo(&info);
|
||||
if(info.nproc != nproc+1) {
|
||||
printf("sysinfotest: FAIL nproc is %d instead of %d\n", info.nproc, nproc+1);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if(info.unused_proc_num != unused_proc_num-1) {
|
||||
printf("sysinfotest: FAIL unused_proc_num is %d instead of %d\n", info.unused_proc_num, unused_proc_num-1);
|
||||
exit(1);
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
wait(&status);
|
||||
sinfo(&info);
|
||||
if(info.nproc != nproc) {
|
||||
printf("sysinfotest: FAIL nproc is %d instead of %d\n", info.nproc, nproc);
|
||||
exit(1);
|
||||
}
|
||||
if(info.unused_proc_num != unused_proc_num) {
|
||||
printf("sysinfotest: FAIL unused_proc_num is %d instead of %d\n", info.unused_proc_num, unused_proc_num);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
void testbad() {
|
||||
int pid = fork();
|
||||
int xstatus;
|
||||
|
||||
if(pid < 0){
|
||||
printf("sysinfotest: fork failed\n");
|
||||
exit(1);
|
||||
}
|
||||
if(pid == 0){
|
||||
sinfo(0x0);
|
||||
exit(0);
|
||||
}
|
||||
wait(&xstatus);
|
||||
if(xstatus == -1) // kernel killed child?
|
||||
exit(0);
|
||||
else {
|
||||
printf("sysinfotest: testbad succeeded %d\n", xstatus);
|
||||
exit(xstatus);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
printf("sysinfotest: start\n");
|
||||
testcall();
|
||||
testmem();
|
||||
testproc();
|
||||
printf("sysinfotest: OK\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#include "kernel/types.h"
|
||||
#include "kernel/sysinfo.h"
|
||||
struct stat;
|
||||
|
||||
// system calls
|
||||
@@ -24,6 +25,7 @@ char *sbrk(int);
|
||||
int sleep(int);
|
||||
int uptime(void);
|
||||
int trace(int);
|
||||
int sysinfo(struct sysinfo*);
|
||||
|
||||
// ulib.c
|
||||
int stat(const char *, struct stat *);
|
||||
|
||||
@@ -37,3 +37,4 @@ entry("sbrk");
|
||||
entry("sleep");
|
||||
entry("uptime");
|
||||
entry("trace");
|
||||
entry("sysinfo");
|
||||
|
||||
Reference in New Issue
Block a user