/* Start.s * Assembly language assist for user programs running on top of Nachos. * * Since we don't want to pull in the entire C library, we define * what we need for a user program here, namely Start and the system * calls. * * ----------------------------------------------------- * This file is part of the BurritOS distribution * Copyright (c) 2022 University of Rennes 1. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details * (see see ). * ----------------------------------------------------- */ #define IN_ASM #include "userlib/syscall.h" // Equivalent to ".text", but with a different name, in order // to be correctly handled by the ldscript .section .sys,"ax",@progbits .align 2 /* ------------------------------------------------------------- * __start * Initialize running a C program, by calling "main". * * NOTE: This has to be first, so that it gets loaded at location 0. * The Nachos kernel always starts a program by jumping to location 0. * ------------------------------------------------------------- */ .globl __start .type __start, @function __start: /* Call the program entry point */ call main li a0, 0 call Exit jr ra /* if we return from main, exit(0) */ /* ------------------------------------------------------------- * System call stubs: * Assembly language assist to make system calls to the Nachos kernel. * There is one stub per system call, that places the code for the * system call into register r10, and leaves the arguments to the * system call alone (in other words, arg1 is in r12, arg2 is * in r13, arg3 is in r14, arg4 is in r15) * * The return value is in r10. This follows the standard C calling * convention on the RISC-V. * ------------------------------------------------------------- */ .globl Halt .type __Halt, @function Shutdown: addi a7,zero,SC_HALT ecall jr ra .globl Exit .type __Exit, @function Exit: addi a7,zero,SC_EXIT ecall jr ra .globl Exec .type __Exec, @function Exec: addi a7,zero,SC_EXEC ecall jr ra .globl Join .type __Join, @function Join: addi a7,zero,SC_JOIN ecall jr ra .globl Create .type __Create, @function Create: addi a7,zero,SC_CREATE ecall jr ra .globl Open .type __Open, @function Open: addi a7,zero,SC_OPEN ecall jr ra .globl Read .type __Read, @function Read: addi a7,zero,SC_READ ecall jr ra .globl Write .type __Write, @function Write: addi a7,zero,SC_WRITE ecall jr ra .globl Seek .type __Seek, @function Seek: addi a7,zero,SC_SEEK ecall jr ra .globl Close .type __Close, @function Close: addi a7,zero,SC_CLOSE ecall jr ra .globl FSList .type __FSList, @function FSList: addi a7,zero,SC_FSLIST ecall jr ra .globl newThread .type __newThread, @function newThread: addi a7,zero,SC_NEW_THREAD ecall jr ra .globl Remove .type __Remove, @function Remove: addi a7,zero,SC_REMOVE ecall jr ra .globl Yield .type __Yield, @function Yield: addi a7,zero,SC_YIELD ecall jr ra .globl PError .type __PError, @function PError: addi a7,zero,SC_PERROR ecall jr ra .globl P .type __P, @function P: addi a7,zero,SC_P ecall jr ra .globl V .type __V, @function V: addi a7,zero,SC_V ecall jr ra .globl SemCreate .type __SemCreate, @function SemCreate: addi a7,zero,SC_SEM_CREATE ecall jr ra .globl SemDestroy .type __SemDestroy, @function SemDestroy: addi a7,zero,SC_SEM_DESTROY ecall jr ra .globl SysTime .type __SysTime, @function SysTime: addi a7,zero,SC_SYS_TIME ecall jr ra .globl LockCreate .type __LockCreate, @function LockCreate: addi a7,zero,SC_LOCK_CREATE ecall jr ra .globl LockDestroy .type __LockDestroy, @function LockDestroy: addi a7,zero,SC_LOCK_DESTROY ecall jr ra .globl LockAcquire .type __LockAquire, @function LockAcquire: addi a7,zero,SC_LOCK_ACQUIRE ecall jr ra .globl LockRelease .type __LockRelease, @function LockRelease: addi a7,zero,SC_LOCK_RELEASE ecall jr ra .globl CondCreate .type __CondCreate, @function CondCreate: addi a7,zero,SC_COND_CREATE ecall jr ra .globl CondDestroy .type __CondDestroy, @function CondDestroy: addi a7,zero,SC_COND_DESTROY ecall jr ra .globl CondWait .type __CondWait, @function CondWait: addi a7,zero,SC_COND_WAIT ecall jr ra .globl CondSignal .type __CondSignal, @function CondSignal: addi a7,zero,SC_COND_SIGNAL ecall jr ra .globl CondBroadcast .type __CondBroadcast, @function CondBroadcast: addi a7,zero,SC_COND_BROADCAST ecall jr ra .globl TtySend .type __TtySend, @function TtySend: addi a7,zero,SC_TTY_SEND ecall jr ra .globl TtyReceive .type __TtyReceive, @function TtyReceive: addi a7,zero,SC_TTY_RECEIVE ecall jr ra .globl Mkdir .type __Mkdir, @function Mkdir: addi a7,zero,SC_MKDIR ecall jr ra .globl Rmdir .type __Rmdir, @function Rmdir: addi a7,zero,SC_RMDIR ecall jr ra .globl Mmap .type __Mmap, @function Mmap: addi a7,zero,SC_MMAP ecall jr ra .globl Debug .type __Debug, @function Debug: addi a7,zero,SC_DEBUG ecall jr ra