aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2022-04-11Handle unimplemented syscalls gracefullyAndrew Waterman1-11/+1
We previously kernel-panicked because that made it more obvious when a syscall implementation was missing. These days, it's more common that the C library will do something sensible in response to returning -ENOSYS. Favor that approach to avoid frustrating users.
2022-04-08Stub out sysinfo syscallAndrew Waterman3-260/+10462
2022-02-17Fix sbi_console_getchar return value if no UART is presentAndrew Waterman1-1/+1
The UART drivers all return -1 if no character is present, and so that's what we should do if there's no UART at all. See discussion on https://github.com/riscv-non-isa/riscv-sbi-doc/issues/82
2022-02-08Fix local variable register usage for ra (#268)Fangrui Song2-3/+2
See https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html#Local-Register-Variables "Other than when invoking the Extended asm, the contents of the specified register are not guaranteed." Also revert 90191ad93eac47d61ab9cc89084050ad1541d160.
2022-02-07Eliminate Wuninitialized for Clang/LLVM (#266)Zenithal1-1/+1
2022-02-07Eliminate Wunknown-pragmas for Clang/LLVM (#265)Zenithal1-1/+1
2022-01-28Merge branch 'compnerd-virtualize'Andrew Waterman1-1/+2
2022-01-28pk: thwart an attempt from the compiler to optimizeSaleem Abdulrasool1-1/+2
The memory manager maintains the first free page as the page after the `_end` synthetic emitted by the linker. This value is stored in a translation unit local variable. This value is only ever written to from `init_early_alloc` which is static and only ever invoked from `pk_vm_init`. Furthermore, the value that `first_free_page` is ever set to is computed as a rounding of the _address_ of `_end`. Because the address of the symbol cannot change during execution of a normal program, this is effectively a constant, making the computed value a "constant" which can be re-materialized. Now, with the knowledge that the value is effectively a constant that can be re-materialized and the fact that the value is ever written to at a single position, we can simply re-materialize the value if it was ever changed in `free_page_addr`. This will allow the 8-byte value to be truncated to 1-byte. Now, we can inline `__early_pgalloc_align`, and because the combination of `__early_alloc` and `__early_pgalloc_align` is small, we can inline that again at the two sites locally. This changes the `__augment_page_freelist` to re-materialize the constant when needed for the allocation. The re-materialization however uses a pc-relative addressing, which now computes a different value than expected - the address has become a VA rather than a PA. This results in the address computed by `free_page_addr` (which is the result of the `__early_pgalloc_align`) to be a virtual address after the relocation, which then propagates through `__early_alloc` to the value in `__augment_page_freelist`, which is then consumed by `__page_alloc`, which will treat the now VA as a PA and perform an additional translation to a VA. Mark the value as `volatile` to indicate that the value must be read at all points to thwart the size optimization of the compiler resulting in a mis-compilation resulting in the eventual invalid memory access during the `memset` that follows the allocation. Thanks to @nzmichaelh for the help in tracking this down!
2022-01-09fix file leakAndrew Waterman1-1/+1
Eliminate excess reference count when associating fd with file. Fixes #258
2021-11-22Reduce tightness of mideleg register assertion (required for H-extension) (#256)Andreas Kuster1-1/+1
2021-09-20Fix fcsr save slot address calculationAndrew Waterman1-1/+1
h/t @jrtc27
2021-09-15Revert "SBI emulation of reads and writes to perf counters and config (#98)"Andrew Waterman1-58/+0
This reverts commit fd2ddce557a9085ccdba1a455eded4808e7466c6. The SBI took a different approach (explicit SBI call) to support writing the counters, rather than using traps.
2021-08-27pk: correct the handling of SYS_getcwd (#250)Saleem Abdulrasool1-1/+1
`SYS_getcwd` is different from `getcwd` in that the return value is < 0 on failure otherwise it is the length of the string. The proxy kernel was treating 0 as success and all other values as error. As a result, we would never return a valid value for `getcwd`. The following program now executes properly with the Proxy Kernel: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <linux/limits.h> int main(int argc, char **argv) { unsigned char buffer[PATH_MAX + 1] = {0}; if (getcwd(buffer, PATH_MAX)) printf("cwd: %s\n", buffer); return EXIT_SUCCESS; } ```
2021-08-12Fix build break from recent merge conflictAndrew Waterman1-1/+1
Resolves #249
2021-08-04Use __builtin_frame_address() instead of "sp" directly.John Baldwin1-3/+3
Also use pointer arithmetic on char * instead of void *.
2021-08-04Revert "machine: fix a case of undefined behaviour with SP handling (#245)"Andrew Waterman1-8/+3
This reverts commit 5450c2f731f16abe3a4f244c383c55f559c97359.
2021-08-04Revert "Revert "Use a global 'tp' register.""Andrew Waterman1-5/+7
This reverts commit 717702ceec053afd424a41ef6a4078d3cbd755b8.
2021-08-04Revert "Use __builtin_frame_address() instead of "sp" directly."Andrew Waterman1-4/+9
This reverts commit 17bec41e9bd44c43901938b784680661b9b28a76.
2021-08-04Use __builtin_frame_address() instead of "sp" directly.John Baldwin1-9/+4
Also use pointer arithmetic on char * instead of void *.
2021-08-04Revert "Use a global 'tp' register."Andrew Waterman1-7/+5
This reverts commit 0d1fdc2e24b7b6247a55d24c13ae85dca7f45695.
2021-08-04Use a global 'tp' register.John Baldwin1-5/+7
clang only supports register variables if they are declared globally.
2021-08-04Revert "machine: correct some additional cases of UB (#246)"Andrew Waterman1-18/+4
This reverts commit e8d15a489fa76612707ff9e99feb0fb36acc9f14.
2021-06-16Set desired endianness at boot time (#247)Marcus Comstedt2-0/+27
2021-05-18Add __early_pgalloc_align; refactor __early_alloc to use itAndrew Waterman1-3/+11
2021-05-18Fix range checkAndrew Waterman1-2/+3
2021-05-07pk: make breakpoints fatalAndrew Waterman1-2/+1
Resolves #216
2021-05-07machine: correct some additional cases of UB (#246)Saleem Abdulrasool1-4/+18
Use of asm aliased register variables in local scope can only be used for extended assembly parameters. This changes the few instances of this in the floating point emulation to use the GNU extended assembly syntax to access the `tp` register. This ensures that we do not rely on undefined behaviour. This was uncovered when building the Proxy kernel with clang and LLVM.
2021-05-07machine: fix a case of undefined behaviour with SP handling (#245)Saleem Abdulrasool1-3/+8
The use of `asm` for register aliasing is supported in two different contexts: - local variables (including GNU expression statements) where it may only be used for specifying registers for input and output operands to extended `asm` syntax. c.f. https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html#Local-Register-Variables - global variables where it may be used to observe the contents of a register. c.f. https://gcc.gnu.org/onlinedocs/gcc/Global-Register-Variables.html#Global-Register-Variables The two options here is to either to hoist the variable out into a global variable, but then it should not be in a header due to fears of ODR in case the optimizer does not inline it away, and thus becomes a bit more tricky. The alternative that this change actually adopts is to explicitly use a move to copy the value out via the GNU extended assembly syntax. With this change, it is now possible to build the Proxy Kernel completely with clang/LLVM and link with LLD. The generated kernel also runs under SPIKE and behaves as expected in a simple smoke test (without any executable prints the expected message, and runs a trivial RVV example).
2021-05-06machine: manually perform assembler relaxation (#244)Saleem Abdulrasool1-1/+3
This is an equivalent rewrite of the existing code. When building with gas, the `bltu` would implicitly get relaxed to the `bgeu` + `j`. This relaxation is required as the `init_other_hart` is not guaranteed to be addressable in 12-bits. When building with the LLVM IAS instead of gas we fail to link as the branch is not relaxed. This change enables LLVM to build and link this code with the LLVM IAS and lld.
2021-05-05replace `spbtr` with `satp` (#241)Saleem Abdulrasool2-2/+2
The LLVM IAS currently does not support the older spelling for the CSR. Update the references to the modern name.
2021-05-05machine: replace `mbadaddr` with `mtval` (#242)Saleem Abdulrasool4-6/+6
The LLVM IAS does not support the older name for the `mtval` CSR. This updates the name to the current spelling, which is required to build with the LLVM IAS. This remains compatible with binutils as well.
2021-05-05replace `sbadaddr` with `stval` (#243)Saleem Abdulrasool2-2/+2
This replaces use of the old `sbadaddr` CSR name with the current `stval` name. The old spelling is not supported by the LLVM IAS, however, the modern spelling is supported by both LLVM and binutils.
2021-04-28pk: Fix __clear_cache() compilation issue with recent compilers (#240)Christoph Müllner2-1/+10
Using recent compilers we get the following error message: ../pk/pk.c: In function 'run_loaded_program.constprop': ../pk/pk.c:177:3: error: both arguments to '__builtin___clear_cache' must be pointers 177 | __clear_cache(0, 0); | ^~~~~~~~~~~~~~~~~~~ Let's use the existing function __riscv_flush_icache(), give it a header with a prototype and use it to emits the FENCE.I instruction directly. See #239 Suggested-by: Andrew Waterman <andrew@sifive.com> Signed-off-by: Christoph Muellner <cmuellner@linux.com>
2021-04-05LiteX UART: fix compatible property name (#237)gsomlo1-1/+2
The upstream LiteX project defaults to "litex,liteuart" as the value for the "compatible" property of the UART DT node, so let's add it to the current list of accepted strings. Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
2021-03-29pk: vm cleanups; use narrower TLB flushesAndrew Waterman1-9/+15
2021-03-29pk: remove vestigial trapframe_t::insn fieldAndrew Waterman4-14/+1
This assumes that stval is populated with the opcode on illegal instruction exceptions. But since we're only using the opcode for error reporting, it's OK if this assumption is violated.
2021-03-29M-mode code doesn't need access to pk's page tableAndrew Waterman3-2/+2
2021-03-29update encoding.hAndrew Waterman1-267/+1145
2021-03-29pk: correctly restore sstatus.SUM in strcpy_from_userAndrew Waterman1-3/+7
2021-03-26pk: support printk before file initAndrew Waterman2-4/+3
2021-03-26pk: don't init files until VM setup is completeAndrew Waterman1-2/+2
2021-03-25pk: refactor vm free list managementAndrew Waterman4-61/+115
2021-03-25pk: support >2 GiB of user memory for RV64Andrew Waterman7-34/+76
Previously, the pk would always run from virtual address MEM_START. Instead, remap it into the negative virtual addresses, allowing user processes to expand beyond MEM_START.
2021-03-25Add some missing syscall stubsAndrew Waterman2-0/+10
2021-03-25pk: avoid assertion failures on brk syscallsAndrew Waterman1-3/+5
Return the old brk if mmap fails, rather than just asserting out
2021-03-25pk: avoid out-of-memory errorsAndrew Waterman2-50/+107
Estimate available memory and return -1 from mmap if not enough is available, rather than assert-failing.
2021-03-25pk: remove linear VA mapping constraintAndrew Waterman1-46/+83
This will improve flexibility going forward.
2021-03-25pk: only access user memory through explicit accessorsAndrew Waterman9-77/+278
Enforced with sstatus.SUM.
2021-03-25Add `statx` syscall (#234)huaixv3-0/+23
2020-12-15Add support for the UART interface on the LiteX SoC (#230)gsomlo5-1/+101
Tested using the RocketChip CPU option. (see https://github.com/enjoy-digital/litex) Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>