mirror of
https://github.com/StepanovPlaton/OSin1000Lines.git
synced 2026-04-04 04:40:48 +04:00
Complete project
This commit is contained in:
36
src/user.c
36
src/user.c
@@ -2,17 +2,41 @@
|
||||
|
||||
extern char __stack_top[];
|
||||
|
||||
int syscall(int sysno, int arg0, int arg1, int arg2) {
|
||||
register int a0 __asm__("a0") = arg0;
|
||||
register int a1 __asm__("a1") = arg1;
|
||||
register int a2 __asm__("a2") = arg2;
|
||||
register int a3 __asm__("a3") = sysno;
|
||||
|
||||
__asm__ __volatile__("ecall"
|
||||
: "=r"(a0)
|
||||
: "r"(a0), "r"(a1), "r"(a2), "r"(a3)
|
||||
: "memory");
|
||||
|
||||
return a0;
|
||||
}
|
||||
|
||||
void putchar(char ch) { syscall(SYS_PUTCHAR, ch, 0, 0); }
|
||||
|
||||
int getchar(void) { return syscall(SYS_GETCHAR, 0, 0, 0); }
|
||||
|
||||
int readfile(const char *filename, char *buf, int len) {
|
||||
return syscall(SYS_READFILE, (int)filename, (int)buf, len);
|
||||
}
|
||||
|
||||
int writefile(const char *filename, const char *buf, int len) {
|
||||
return syscall(SYS_WRITEFILE, (int)filename, (int)buf, len);
|
||||
}
|
||||
|
||||
__attribute__((noreturn)) void exit(void) {
|
||||
syscall(SYS_EXIT, 0, 0, 0);
|
||||
for (;;)
|
||||
;
|
||||
}
|
||||
|
||||
void putchar(char c) { /* Доделать*/ }
|
||||
|
||||
__attribute__((section(".text.start"))) __attribute__((naked)) void
|
||||
start(void) {
|
||||
__asm__ __volatile__(
|
||||
"mv sp, %[stack_top] \n"
|
||||
"call main \n"
|
||||
"call exit \n" ::[stack_top] "r"(__stack_top));
|
||||
__asm__ __volatile__("mv sp, %[stack_top]\n"
|
||||
"call main\n"
|
||||
"call exit\n" ::[stack_top] "r"(__stack_top));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user