summaryrefslogtreecommitdiff
path: root/lib/sbi
AgeCommit message (Collapse)Author
2024-09-23lib: sbi_domain_context: Fix file permissionsSamuel Holland
These C source files should not be marked as executable. Signed-off-by: Samuel Holland <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-09-23lib: sbi: Respect scounteren when emulating the time CSRSamuel Holland
This optimization creates a correctness issue, as it prevents supervisor software from restricting VS-mode or U-mode access to the time CSR for its own purposes. Closes: https://github.com/riscv-software-src/opensbi/issues/370 Fixes: ebc8ebc0f846 ("lib: sbi: Improve HPM CSR read/write emulation") Signed-off-by: Samuel Holland <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-09-23lib: sbi: fwft: add support for SBI_FWFT_POINTER_MASKING_PMLENSamuel Holland
Add support for controlling the pointer masking mode on harts which support the Smnpm extension. This extension can only exist on harts where XLEN >= 64 bits. This implementation selects the mode with the smallest PMLEN that satisfies the caller's requested lower bound. Signed-off-by: Samuel Holland <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-09-20lib: sbi: Fix writes to emulated 32-bit htimedelta CSRSamuel Holland
Writes to the low half CSR should not affect the high half of the value. Make this separation explicit by writing to the delta in memory as two adjacent XLEN-sized values. Fixes: 1e9f88889f8b ("lib: Emulate HTIMEDELTA CSR for platforms not having TIME CSR") Signed-off-by: Samuel Holland <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-09-20lib: sbi: Use a linked list to track domainsSamuel Holland
This removes the compile-time limit on the number of domains. It also reduces firmware size by about 200 bytes by removing the lookup table. Signed-off-by: Samuel Holland <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-08-24lib: Delete redundant `ulong`Zhang RunMin
In `csr_read_allowed` and `csr_write_allowed` macros, has already converted second param to `ulong`. So delete redundant `ulong` where uses csr_read/write_allowed macros. Signed-off-by: Zhang RunMin <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-08-24lib: sse: remove unused sse_inject_out() parameterClément Léger
This parameters was a remnant of a previous version, remove it now that it is unused. Signed-off-by: Clément Léger <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-08-23lib: sbi: Enhance CSR Handling in system_opcode_insnDongdong Zhang
- Completed TODO in `system_opcode_insn` to ensure CSR read/write instruction handling. - Refactored to use new macros `GET_RS1_NUM` and `GET_CSR_NUM`. - Updated `GET_RM` macro and replaced hardcoded funct3 values with constants (`CSRRW`, `CSRRS`, `CSRRC`, etc.). - Removed redundant `GET_RM` from `riscv_fp.h`. - Improved validation and error handling for CSR instructions. This patch enhances the clarity and correctness of CSR handling in `system_opcode_insn`. Signed-off-by: Dongdong Zhang <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-08-09lib: sbi: Implement aligned memory allocatorsGregor Haas
This change adds a simple implementation of sbi_aligned_alloc(), for future use in allocating aligned memory for SMMTT tables. Signed-off-by: Gregor Haas <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-08-09lib: sbi: Allocate from beginning of heap blocksGregor Haas
In the next commit, we'll add a new sbi_memalign() function. In order to allocate aligned memory, we'll sometimes need to allocate from the middle of a heap block, effectively splitting it in two. Allocating from the beginning of a heap block in the nonaligned case more closely matches this behavior, reducing the complexity of understanding the heap implementation. Signed-off-by: Gregor Haas <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-08-09lib: sbi: Support multiple heapsGregor Haas
The upcoming SMMTT implementation will require some larger contiguous memory regions for the memory tracking tables. We plan to specify the memory region for these tables as a reserved-memory node in the device tree, and then dynamically allocate individual tables out of this region. These changes to the SBI heap allocator will allow us to explicitly create and allocate from a dedicated heap tied to the table memory region. Signed-off-by: Gregor Haas <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-08-02lib: sbi: check result of pmp_get() in is_pmp_entry_mapped()Carlos López
pmp_get() may return an error if the given entry, given by the caller of is_pmp_entry_mapped(), is invalid. This results in the output parameters for pmp_get() being uninitialized. To avoid using garbage values, check the result and return early if necessary. This issue is not being hit because at the moment is_pmp_entry_mapped() is only being called from a single site with a valid hardcoded value. Signed-off-by: Carlos López <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-08-02lib: sbi: fwft: fix incorrect size passed to sbi_zalloc()Carlos López
The fwt_hart_state struct inciludes a flexible array member, so its allocation size will be that of the struct itself, plus that of each of the members in the array. When calculating this size, instead of taking the size of the struct, the size of a pointer to it was taken, which is incorrect. Luckily, this happenned to not produce memory corruption because the size of the non-flexible members of the struct is the same as the size of a pointer. Signed-off-by: Carlos López <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-08-02lib: sbi: dbtr: fix potential NULL pointer dereferencesCarlos López
In several dbtr functions, we first check that the dbtr trigger is not NULL and that its state is what we expect. However, it only makes sense to perform the second check if the dbtr trigger is not NULL. Othwerwise we will dereference a NULL pointer. Thus, change the condition so that it shortcuts to the first check if necessary. Signed-off-by: Carlos López <[email protected]> Reviewed-By: Anup Patel <[email protected]>
2024-07-24lib: sbi: Introduce an early console buffer for caching early printsAnup Patel
The console device is registered by platform only in early_init() callback so any prints before this point will be lost. Introduce an early console buffer for caching prints before platform early_init(). For crashes before platform early_init(), users can simply dump the contents of the console_early_buffer[] string using a debugger. The relative address of the console_early_buffer[] string can be found using following two commands: CONSOLE_EARLY_FIFO_ADDR=`${CROSS_COMPILE}objdump -D \ build/platform/generic/firmware/fw_dynamic.elf | \ grep "<console_early_fifo>:" | awk '{print $1}'` ${CROSS_COMPILE}objdump -R build/platform/generic/firmware/fw_dynamic.elf | \ grep $CONSOLE_EARLY_FIFO_ADDR | awk '{print $3}' Signed-off-by: Anup Patel <[email protected]> Reviewed-By: Himanshu Chauhan <[email protected]>
2024-07-24lib: sbi: Allow forceful queueing of data in sbi_fifo_enqueue()Anup Patel
Extend sbi_fifo_enqueue() to allow forceful queueing by droping data from the tail. Signed-off-by: Anup Patel <[email protected]> Reviewed-By: Himanshu Chauhan <[email protected]>
2024-07-24lib: sbi: Optimize fifo enqueue/dequeue for basic data typesAnup Patel
Don't use sbi_memcpy() for basic data types in fifo enqueue/dequeue instead use direct type-cast and assignment. Signed-off-by: Anup Patel <[email protected]> Reviewed-By: Himanshu Chauhan <[email protected]>
2024-07-24lib: sbi: Remove sbi_console_init() and console_init() platform callbackAnup Patel
Now that all platforms have been updated to initialize serial console device in early_init(), the sbi_console_init() and console_init() platform callback are redundant hence remove them. Signed-off-by: Anup Patel <[email protected]> Reviewed-By: Himanshu Chauhan <[email protected]>
2024-07-24lib: sbi_hsm: Save/restore menvcfg only when it existsSamuel Holland
Attempting to access the menvcfg CSR raises an illegal instruction exception on hardware which implements Sm1p11 or older. Fixes: e9ee9678ba50 ("lib: sbi: fwft: add support for SBI_FWFT_PTE_AD_HW_UPDATING") Signed-off-by: Samuel Holland <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-07-23lib: tests: add math test suiteDongdong Zhang
This patch introduces a new math test suite to the SBI unit tests. The changes include: * Updating lib/sbi/tests/objects.mk to include math_test_suite and sbi_math_test.o. * Adding a new file lib/sbi/tests/sbi_math_test.c which contains tests for log2roundup function using various cases. The addition of this test suite ensures that mathematical functions are verified and work as expected. Signed-off-by: Dongdong Zhang <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-07-23lib: tests: enhance test output with colored pass/fail messagesDongdong Zhang
This patch improves the readability of the SBI unit test output by adding color-coded status messages. Adding ANSI color codes for green (pass) and red (fail) in sbi_unit_test.c. Now, the test results will be displayed in green for passed tests and red for failed tests, making it easier to quickly distinguish between them. Signed-off-by: Dongdong Zhang <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-07-04Makefile: change to using .carray.c for carray filesBen Dooks
We would like to clean any files generated by the carray scripts by just searching for the filename as the current make system turns f.carray into f.o. Change to make the make system turn f.carray into f.carray.o note, command to go through .mk files changing the .o in the .mk files is: find . -type f -name "*.carray" | xargs -t -I fname /bin/bash -x -c ' fn=`basename -s .carray fname`; echo "$fn"; sed -i `dirname fname `/objects.mk -e s/"$fn".o/"$fn".carray.o/g' Link: https://patchwork.ozlabs.org/project/opensbi/patch/[email protected]/ Reported-by: Ivan Orlov <[email protected]> Suggested-by: Andrew Jones <[email protected]> Signed-off-by: Ben Dooks <[email protected]> Reviewed-by: Andrew Jones <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-07-04lib: sbi_emulate_csr: Do not log illegal CSR accessesSamuel Holland
Illegal CSR accesses from lower privilege modes are delegated to S-mode and do not necessarily indicate a bug. Supervisor software may want to emulate some CSRs, or may intentionally disable access to certain existing CSRs, and thus will expect traps when those CSRs are accessed. For example, Linux disables sstatus.VS by default in order to detect when userspace first accesses vector register state; this includes the CSRs defined by the V extesion. As a result, if the first vector instruction in a process is a CSR access, OpenSBI will log the illegal instruction exception, even though there is no unexpected or erroneous behavior occurring. Since the illegal instruction exception is delegated to S-mode, S-mode software should be responsible for reporting the exception, not OpenSBI. Signed-off-by: Samuel Holland <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-06-28lib: sbi: check incoming dbtr shmem addressSergey Matyukevich
Current Debug Trigger SBI extension proposal suggests to activate shmem area and obtain its physical address from S-mode software in the following way: : If both `shmem_phys_lo` and `shmem_phys_hi` parameters are not : all-ones bitwise then `shmem_phys_lo` specifies the lower XLEN : bits and `shmem_phys_hi` specifies the upper XLEN bits of the : shared memory physical base address. The `shmem_phys_lo` MUST : be `(XLEN / 8)` byte aligned and the size of shared memory is : assumed to be `trig_max * (XLEN / 2)` bytes. For more details see the current version of the proposal: - https://lists.riscv.org/g/tech-debug/message/1302 On the other hand, on RV32, the M-mode can only access the first 4GB of the physical address space because M-mode does not have MMU to access full 34-bit physical address space. Similarly, on RV64, the M-mode can only access memory addressed by 64 bits. This commit checks shmem address in function sbi_dbtr_setup_shmem to make sure that shmem_phys_hi part of the valid address is zero. Besides, the macro DBTR_SHMEM_MAKE_PHYS is updated to take into account only low XLEN part. Signed-off-by: Sergey Matyukevich <[email protected]> Reviewed-by: Himanshu Chauhan <[email protected]>
2024-06-26lib: sbi: fwft: return SBI_EINVAL rather than SBI_ERR_INVALID_PARAMClément Léger
Error code returned by the ecall handles should use the defines from sbi_ecall_interface.h rather than sbi_error.h. Signed-off-by: Clément Léger <[email protected]> Reviewed-by: Andrew Jones <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-06-26lib: sbi: fwft: check feature value to be exactly 1 or 0Clément Léger
As stated by the spec and pointed out by Andrew Jones, the value passed for MISALIGNED_EXC_DELEG and PTE_AD_HW_UPDATING should be either 0 or 1. Add check for these values and return SBI_EINVAL if not. Signed-off-by: Clément Léger <[email protected]> Reviewed-by: Andrew Jones <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-06-19lib: sbi: implement SBI FWFT extensionClément Léger
The SBI FWFT extension defines a set of function that can be called to control the configuration of some platform features (misaligned trap delegation, etc). This patch implements sbi_fwft_set() and sbi_fwft_get() as defined in the specification [1]. Link: https://lists.riscv.org/g/tech-prs/message/924 [1] Signed-off-by: Clément Léger <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-06-19lib: sbi: fwft: add support for SBI_FWFT_PTE_AD_HW_UPDATINGClément Léger
Add support for SBI_FWFT_PTE_AD_HW_UPDATING based on SVADU presence. Signed-off-by: Clément Léger <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-06-19lib: sbi: fwft: add support for SBI_FWFT_MISALIGNED_EXC_DELEGClément Léger
Add support for SBI_FWFT_MISALIGNED_EXC_DELEG withing FWFT support. This support allows to delegate misaligned accesses traps. Signed-off-by: Clément Léger <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-06-19lib: sbi: add support for firmware features extensionClément Léger
This extension allows the software running in supervisor mode to control the behavior of various features of the SBI [1]. Implement the support for such extension. Link: https://lists.riscv.org/g/tech-prs/message/924 [1] Signed-off-by: Clément Léger <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-06-18lib: sbi: Add support for Svade and Svadu extensionsYong-Xuan Wang
Add support for Svade and Svadu extensions. When both are present in the device tree, the M-mode firmware should select the Svade extension to comply with the RVA23 profile, which mandates Svade and lists Svadu as an optional extension. Signed-off-by: Yong-Xuan Wang <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-06-13sbi: sbi_domain_context: Fix trap context for domain context switchingYu Chien Peter Lin
Save/restore sbi_trap_context during domain context switching to ensure proper trap handling and isolation. This maintains correct domain-specific state, avoiding context corruption. Fixes: abea949721bc ("lib: sbi: Introduce trap context") Signed-off-by: Yu Chien Peter Lin <[email protected]> Reviewed-by: Alvin Chang <[email protected]> Tested-by: Alvin Chang <[email protected]> Reviewed-by: Yong Li <[email protected]> Tested-by: Yong Li <[email protected]>
2024-05-23lib: sbi: sse: handle missing writable attributesClément Léger
The spec states that a6, a7, flags and sepc are writable but the implementation was not allowing that. Add support for these 4 writable attributes. Signed-off-by: Clément Léger <[email protected]> Reviewed-by: Samuel Holland <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-05-15lib: sbi: Put event after use in sbi_sse_exit() loopAnup Patel
Currently, the sbi_sse_exit() gets event in a loop but does not put it back after use. This results in global events remaining locked causing hangs on sub-sequent calls to sse_event_get() for global events. Fixes: c8cdf01d8f3a ("lib: sbi: Add support for Supervisor Software Events extension") Signed-off-by: Anup Patel <[email protected]> Reviewed-by: Himanshu Chauhan <[email protected]>
2024-05-13lib: sbi: simplify inline function in sbi_dtbr.cXiang W
The inline function can simplify the code by setting some call restrictions. This ensures logical smoothness Signed-off-by: Xiang W <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-05-13lib: sbi: fix return type of sbi_dbtr_shmem_disabledXiang W
Modify the return value of the sbi_dbtr_shmem_disabled function to bool to make the semantics clearer. Signed-off-by: Xiang W <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-05-13lib: sbi: Fixed memory permission check in sbi_dbtr_setup_shmemXiang W
The previous code detected shmem_phys_hi and shmem_phys_lo as two addresses. fix this bug Signed-off-by: Xiang W <[email protected]> Reviewed-by: Himanshu Chauhan <[email protected]>
2024-05-13lib: sbi: fix DBTR_SHMEM_MAKE_PHYS for RV64Xiang W
Obtaining a 64-bit address under rv64 does not require combining 32-bit registers Signed-off-by: Xiang W <[email protected]> Reviewed-by: Himanshu Chauhan <[email protected]>
2024-05-13lib: sbi: Removal unnecessary check dbtr_thishart_state_ptrXiang W
After getting hart_shmem_base, dbtr_thishart_state_ptr cannot be empty. So remove check code. Signed-off-by: Xiang W <[email protected]> Reviewed-by: Himanshu Chauhan <[email protected]>
2024-05-13lib: sbi: fix hart_shmem_baseXiang W
When only phys_hi is equal to SBI_DBTR_SHMEM_INVALID_ADDR, it may be a legal address. The old code would modify the legal address. Signed-off-by: Xiang W <[email protected]> Reviewed-by: Himanshu Chauhan <[email protected]>
2024-05-07sbi: sbi_domain_context: Add spinlock for updating domain assigned_hartsAlvin Chang
Add spinlock protection to avoid race condition on assigned_harts during domain context switching. Also, rename/add variables for accessing the corresponding domain of target/current context. Signed-off-by: Alvin Chang <[email protected]> Reviewed-by: Yu Chien Peter Lin <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-05-07lib: sbi: Refine the settings for switching to Virtual Supervisor Mode.Pope B.Lei
Although Mstatus.MPV is set, before executing mret, access to VS mode registers should use the actual register addresses, not the pseudonyms of S registers. Signed-off-by: Pope B.Lei <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-05-07lib: sbi: sse: check handler entry to belong to supervisor modeClément Léger
When registering an SSE event, check for the handler_entry_pc to belong to supervisor mode domain using sbi_domain_check_addr_range(). Signed-off-by: Clément Léger <[email protected]> Reported-by: Samuel Holland <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-05-07lib: sbi: sse: use PRV_S instead of hardcoded value for modeClément Léger
Rather then passing 1 to sbi_domain_check_addr_range() for supervisor mode, use PRV_S. Signed-off-by: Clément Léger <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-05-07lib: sbi: sse: call enable callback before sending IPIClément Léger
Move the enable callback call before sending the IPI. Even though the event is locked and no race condition can happen, this is more logical. Signed-off-by: Clément Léger <[email protected]> Reported-by: Samuel Holland <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-05-07lib: sbi: sse: remove superfluous sbi_list_empty() checkClément Léger
The list loop below that check is actually not looping if the list is empty so there was no need for this check. Signed-off-by: Clément Léger <[email protected]> Reported-by: Samuel Holland <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-05-07lib: sbi: sse: simplify 32bits overflow checkClément Léger
Rather than checking 32bits overflow with some absolute value, check the value to be different from the cast itself. Signed-off-by: Clément Léger <[email protected]> Reported-by: Samuel Holland <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-05-07lib: sbi: sse: rename sse_hart_unlock() to sse_enabled_event_unlock()Clément Léger
There was a naming incoherency between enabled events list lock/unlock. Rename sse_hart_unlock() to sse_enabled_event_unlock() to be coherent and reword comments above lock()/unlock() functions. Signed-off-by: Clément Léger <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-05-07lib: sbi: sse: fix typos, comments and spacing errorsClément Léger
Fix some errors spotted by Samuel while reviewing the SSE implementation. Signed-off-by: Clément Léger <[email protected]> Reported-by: Samuel Holland <[email protected]> Reviewed-by: Anup Patel <[email protected]>
2024-05-07lib: tests: Add test for spinlocksIvan Orlov
Implement the test which covers some of the functions from the `riscv_locks.h` file. This test consists of 3 test cases: 1) For lock/unlock functions 2) Unsuccessful trylock (the lock was previously taken) 3) Successful trylock (the lock is free and can be taken) Signed-off-by: Ivan Orlov <[email protected]> Reviewed-by: Anup Patel <[email protected]>