set iomb to forbid i/o instructions from user space

add to test that they indeed trap in user space
thanks to pablogventura@gmail.com and nwolovick@gmail.com
This commit is contained in:
Frans Kaashoek 2016-08-26 08:20:11 -04:00
parent 745a4d31a6
commit aff0c8d5c7
2 changed files with 33 additions and 0 deletions

View file

@ -1695,6 +1695,35 @@ fsfull()
printf(1, "fsfull test finished\n");
}
void
uio()
{
#define RTC_ADDR 0x70
#define RTC_DATA 0x71
ushort port = 0;
uchar val = 0;
int pid;
printf(1, "uio test\n");
pid = fork();
if(pid == 0){
port = RTC_ADDR;
val = 0x09; /* year */
/* http://wiki.osdev.org/Inline_Assembly/Examples */
asm volatile("outb %0,%1"::"a"(val), "d" (port));
port = RTC_DATA;
asm volatile("inb %1,%0" : "=a" (val) : "d" (port));
printf(1, "uio: uio succeeded; test FAILED\n");
exit();
} else if(pid < 0){
printf (1, "fork failed\n");
exit();
}
wait();
printf(1, "uio test done\n");
}
unsigned long randstate = 1;
unsigned int
rand()
@ -1751,6 +1780,9 @@ main(int argc, char *argv[])
iref();
forktest();
bigdir(); // slow
uio();
exectest();
exit();

1
vm.c
View file

@ -168,6 +168,7 @@ switchuvm(struct proc *p)
cpu->gdt[SEG_TSS].s = 0;
cpu->ts.ss0 = SEG_KDATA << 3;
cpu->ts.esp0 = (uint)proc->kstack + KSTACKSIZE;
cpu->ts.iomb = (ushort) 0xFFFF; // forbid I/O instructions from user space
ltr(SEG_TSS << 3);
if(p->pgdir == 0)
panic("switchuvm: no pgdir");