syscalls_call_table:
.quad syscall_print
.quad syscall_print_low_mmap
+ .quad syscall_yield
syscalls_call_table_end:
.set syscall_n, (syscalls_call_table_end - syscalls_call_table) >> 3 # Because / 8 *doesn't work* !
.globl syscall_n
});
}
+extern "C" void os::syscall_yield() {
+ if (os::processes.present(os::current_pid + 1)) {
+ os::current_pid += 1;
+ } else {
+ os::current_pid = 0;
+ }
+}
+
extern "C" void os::syscall_rax_error_handler() {
os::assert(false, "Incorrect %rax for syscall.");
}
extern "C" void syscall_print(char c);
extern "C" void syscall_print_low_mmap();
+extern "C" void syscall_yield();
extern "C" void syscall_rax_error_handler();
void set_ring0_stack(tss& tss, std::uint64_t stack);
mov $1, %rax
syscall
ret
+
+.globl yield
+yield:
+ mov $2, %rax
+ syscall
+ ret
extern "C" void print(char c);
extern "C" void check_mem();
+extern "C" void yield();
void printstr(const char* str) {
for (size_t i = 0; str[i] != '\0'; i++) {
}
extern "C" void _start() {
- const char* str = "ACAB cependant.\n";
- for (size_t i = 0; i < 16; i++) {
- printstr(str);
- }
- printstr("Mem:\n");
+ printstr("Mem prg 1:\n");
check_mem();
printstr("Done.\n");
- while (true) {}
+ printstr("Prg 1.\n");
+ yield();
+ printstr("Prg 1 again.\n");
+
+ while (true) {
+ yield();
+ printstr("Prg 1 again.\n");
+ }
}