diff options
author | Thaminda Edirisooriya <thaminda@google.com> | 2015-08-26 14:54:31 -0700 |
---|---|---|
committer | Ronald G. Minnich <rminnich@gmail.com> | 2015-09-10 17:26:38 +0000 |
commit | 95ba4c87f5f4802e2afaeae38003db5e7235864a (patch) | |
tree | 5e1c146e873afc58695ee22a056f5546b6cc8bed /src/arch/riscv/include | |
parent | b094583c6fd9d330be28ed6feb1c1140de07ff37 (diff) |
riscv-trap-handling: Add implementation for trap calls in riscv
RISCV requires the bios/bootloader to set up an interface by which it
can get information about memory, talk to host devices, etc. Put
implementation for spike in
src/mainboard/emulation/spike-riscv/spike_util.c, and
src/arch/riscv/trap_handler.c
Change-Id: Ie1d5f361595e48fa6cc1fac25485ad623ecdc717
Signed-off-by: Thaminda Edirisooriya <thaminda@google.com>
Reviewed-on: http://review.coreboot.org/11368
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
Diffstat (limited to 'src/arch/riscv/include')
-rw-r--r-- | src/arch/riscv/include/arch/errno.h | 66 | ||||
-rw-r--r-- | src/arch/riscv/include/arch/exception.h | 22 | ||||
-rw-r--r-- | src/arch/riscv/include/spike_util.h | 17 |
3 files changed, 105 insertions, 0 deletions
diff --git a/src/arch/riscv/include/arch/errno.h b/src/arch/riscv/include/arch/errno.h new file mode 100644 index 0000000000..6f80ee5afd --- /dev/null +++ b/src/arch/riscv/include/arch/errno.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2013, The Regents of the University of California (Regents). + * All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Regents nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, + * SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS + * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED + * HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE + * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef _RISCV_ERRNO_BASE_H +#define _RISCV_ERRNO_BASE_H + +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Argument list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No child processes */ +#define EAGAIN 11 /* Try again */ +#define ENOMEM 12 /* Out of memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* File table overflow */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Not a typewriter */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Math argument out of domain of func */ +#define ERANGE 34 /* Math result not representable */ + +#endif diff --git a/src/arch/riscv/include/arch/exception.h b/src/arch/riscv/include/arch/exception.h index befab1f1a3..4318cba8b6 100644 --- a/src/arch/riscv/include/arch/exception.h +++ b/src/arch/riscv/include/arch/exception.h @@ -32,8 +32,30 @@ #include <stdint.h> +typedef struct +{ + uintptr_t gpr[32]; + uintptr_t status; + uintptr_t epc; + uintptr_t badvaddr; + uintptr_t cause; + uintptr_t insn; +} trapframe; + +typedef uint32_t insn_t; + +typedef struct { + uintptr_t error; + insn_t insn; +} insn_fetch_t; + static inline void exception_init(void) { } +void trap_handler(trapframe* tf); +void handle_supervisor_call(trapframe* tf); +//void handleMisalignedLoad(trapframe *tf); +void handle_misaligned_store(trapframe *tf); + #endif diff --git a/src/arch/riscv/include/spike_util.h b/src/arch/riscv/include/spike_util.h index a9d14cccf1..e9c0300aaa 100644 --- a/src/arch/riscv/include/spike_util.h +++ b/src/arch/riscv/include/spike_util.h @@ -40,6 +40,12 @@ #define FROMHOST_DATA(fromhost_value) ((uint64_t)(fromhost_value) << 16 >> 16) typedef struct { + unsigned long base; + unsigned long size; + unsigned long node_id; +} memory_block_info; + +typedef struct { unsigned long dev; unsigned long cmd; unsigned long data; @@ -63,11 +69,22 @@ typedef struct { // hart-local storage, at top of stack #define HLS() ((hls_t*)(MACHINE_STACK_TOP() - HLS_SIZE)) +#define OTHER_HLS(id) ((hls_t*)((void*)HLS() + RISCV_PGSIZE * ((id) - HLS()->hart_id))) #define MACHINE_STACK_SIZE RISCV_PGSIZE +uintptr_t translate_address(uintptr_t vAddr); +uintptr_t mcall_query_memory(uintptr_t id, memory_block_info *p); +uintptr_t mcall_hart_id(void); uintptr_t htif_interrupt(uintptr_t mcause, uintptr_t* regs); uintptr_t mcall_console_putchar(uint8_t ch); void testPrint(void); +uintptr_t mcall_dev_req(sbi_device_message *m); +uintptr_t mcall_dev_resp(void); +uintptr_t mcall_set_timer(unsigned long long when); +uintptr_t mcall_clear_ipi(void); +uintptr_t mcall_send_ipi(uintptr_t recipient); +uintptr_t mcall_shutdown(void); +void hls_init(uint32_t hart_id); // need to call this before launching linux #endif |