1 /* (CC-BY-NC-SA) ROBIN KRENS - ROBIN @ ROBINKRENS.NL
4 * 2019/9/20 - ROBIN KRENS
9 * |----------------------------|
11 * |--------------------|-------|
21 * |----------------------------|
23 * TODO: include in header enum
31 #include <sys/robsys.h>
34 #include <lib/stdio.h>
35 #include <lib/string.h>
36 #include <lib/regfunc.h>
37 #include <lib/tinyprintf.h>
40 /* the function gets called for
42 __attribute__ ((naked))
43 void * __svc_handler__(int x) {
50 "mrseq r0, msp" "\n\t"
51 "mrsne r0, psp" "\n\t"
52 "ldr r0, [r0, #24]" "\n\t"
53 "ldrb %0, [r0, #-2]" : "=r" (svc_nr) );
55 printf("SYSTEM CALL NR: %d", svc_nr);
59 volatile uint32_t * sp;
64 "mrseq %0, msp" "\n\t"
65 "mrsne r0, psp" : "=r" (sp) );
68 for (int i = 0; (sp + i) < 0x20010000; i++) {
69 printf("ADDRESS: %p, VALUE: %x\n", (sp + i), *(sp + i));
73 //asm ("mov %0, pc" : "=r" (link_register));
74 //printf("%x\n", link_register);
76 volatile uint32_t * svc_number = (uint32_t *) 0x20022222;
79 //uint8_t tmp = link_register[-2];
80 printf("SVC nr: %x", *svc_number);
81 //printf("%d, %d, %d, %d, %d, %d\n", msp[6], msp[0], msp[1], msp[2], msp[3], msp[4]);
89 void syscall(unsigned int * args) {
91 uint32_t svc_number = 99;
92 printf("SYSCALL NR: %x", svc_number);
95 /* switch(SYSCALL_NO) {
105 void syscall_init() {
108 /* SVC is located at position 11 in the interrupt vector table */
109 // extern void * _syscall;
110 extern void * hardfault;
112 ivt_set_gate(11, __svc_handler__, 0);
117 static void kernel_cputs(char * s, size_t l) {
123 void kernel_omnigod() {