Add SYS_putc and SYS_puts.
This commit is contained in:
parent
fa8314c1c1
commit
d846d0f0c6
4
Makefile
4
Makefile
@ -69,8 +69,8 @@ debug-nox: image.bin
|
||||
-ex "break _start" \
|
||||
-ex "continue"
|
||||
|
||||
fs.img: kernel.bin tools/mkfs user/false user/greet user/div0
|
||||
tools/mkfs $@ $< user/false user/greet user/div0
|
||||
fs.img: kernel.bin tools/mkfs user/false user/greet user/div0 user/shout
|
||||
tools/mkfs $@ $< user/false user/greet user/div0 user/shout
|
||||
|
||||
LDFLAGS=-m elf_i386
|
||||
|
||||
|
||||
22
cpu/idt.c
22
cpu/idt.c
@ -109,6 +109,21 @@ void trap(registers_t *r) {
|
||||
}
|
||||
}
|
||||
|
||||
static void* get_userspace_ptr(uint32_t ptr) {
|
||||
if (ptr >= 0xffffffff - USER_BASE) {
|
||||
return 0;
|
||||
}
|
||||
return (void*)(ptr + USER_BASE);
|
||||
}
|
||||
|
||||
static int handle_puts(const char* s) {
|
||||
if (!s) {
|
||||
return -1;
|
||||
}
|
||||
printk(s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void handle_syscall(registers_t* r) {
|
||||
switch (r->eax) {
|
||||
case SYS_exit:
|
||||
@ -122,6 +137,13 @@ static void handle_syscall(registers_t* r) {
|
||||
printk("Hello world!\n");
|
||||
r->eax = 0;
|
||||
break;
|
||||
case SYS_putc:
|
||||
printk((const char[]){r->ebx, '\0'});
|
||||
r->eax = 0;
|
||||
break;
|
||||
case SYS_puts:
|
||||
r->eax = handle_puts(get_userspace_ptr(r->ebx));
|
||||
break;
|
||||
default:
|
||||
printk("Unknown syscall\n");
|
||||
r->eax = -1;
|
||||
|
||||
@ -4,6 +4,8 @@ enum {
|
||||
T_SYSCALL = 0x84,
|
||||
SYS_exit = 0,
|
||||
SYS_greet = 1,
|
||||
SYS_putc = 2,
|
||||
SYS_puts = 3,
|
||||
};
|
||||
|
||||
int syscall(int call, int arg);
|
||||
|
||||
16
user/shout.c
Normal file
16
user/shout.c
Normal file
@ -0,0 +1,16 @@
|
||||
#include "../syscall.h"
|
||||
#include <stdint.h>
|
||||
|
||||
void userspace_puts(const char* s) {
|
||||
char c;
|
||||
while ((c = *s++)) {
|
||||
syscall(SYS_putc, c);
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
const char* spell = "cra cra trif traf not sgnieflet\n";
|
||||
userspace_puts(spell);
|
||||
syscall(SYS_puts, (uint32_t)spell);
|
||||
return 0;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user