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 "break _start" \
|
||||||
-ex "continue"
|
-ex "continue"
|
||||||
|
|
||||||
fs.img: kernel.bin 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
|
tools/mkfs $@ $< user/false user/greet user/div0 user/shout
|
||||||
|
|
||||||
LDFLAGS=-m elf_i386
|
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) {
|
static void handle_syscall(registers_t* r) {
|
||||||
switch (r->eax) {
|
switch (r->eax) {
|
||||||
case SYS_exit:
|
case SYS_exit:
|
||||||
@ -122,6 +137,13 @@ static void handle_syscall(registers_t* r) {
|
|||||||
printk("Hello world!\n");
|
printk("Hello world!\n");
|
||||||
r->eax = 0;
|
r->eax = 0;
|
||||||
break;
|
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:
|
default:
|
||||||
printk("Unknown syscall\n");
|
printk("Unknown syscall\n");
|
||||||
r->eax = -1;
|
r->eax = -1;
|
||||||
|
|||||||
@ -4,6 +4,8 @@ enum {
|
|||||||
T_SYSCALL = 0x84,
|
T_SYSCALL = 0x84,
|
||||||
SYS_exit = 0,
|
SYS_exit = 0,
|
||||||
SYS_greet = 1,
|
SYS_greet = 1,
|
||||||
|
SYS_putc = 2,
|
||||||
|
SYS_puts = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
int syscall(int call, int arg);
|
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