forked from Mirrors/opensbi

csr_read_allowed/csr_read_allowed requires trap.case to detect the results, but if no exception occurs, the value of trap.case will remain unchanged, which makes the detection results unreliable. Add code to initialize trap.case to 0. Signed-off-by: Xiang W <wxjstz@126.com> Reviewed-by: Anup Patel <anup.patel@wdc.com>
54 lines
1.6 KiB
C
54 lines
1.6 KiB
C
/*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*
|
|
* Copyright (c) 2020 Western Digital Corporation or its affiliates.
|
|
*
|
|
* Authors:
|
|
* Atish Patra <atish.patra@wdc.com>
|
|
*/
|
|
|
|
#ifndef __SBI_CSR_DETECT__H
|
|
#define __SBI_CSR_DETECT__H
|
|
|
|
#include <sbi/riscv_encoding.h>
|
|
#include <sbi/sbi_hart.h>
|
|
#include <sbi/sbi_trap.h>
|
|
|
|
#define csr_read_allowed(csr_num, trap) \
|
|
({ \
|
|
register ulong tinfo asm("a3") = (ulong)trap; \
|
|
register ulong ttmp asm("a4"); \
|
|
register ulong mtvec = sbi_hart_expected_trap_addr(); \
|
|
register ulong ret = 0; \
|
|
((struct sbi_trap_info *)(trap))->cause = 0; \
|
|
asm volatile( \
|
|
"add %[ttmp], %[tinfo], zero\n" \
|
|
"csrrw %[mtvec], " STR(CSR_MTVEC) ", %[mtvec]\n" \
|
|
"csrr %[ret], %[csr]\n" \
|
|
"csrw " STR(CSR_MTVEC) ", %[mtvec]" \
|
|
: [mtvec] "+&r"(mtvec), [tinfo] "+&r"(tinfo), \
|
|
[ttmp] "+&r"(ttmp), [ret] "=&r" (ret) \
|
|
: [csr] "i" (csr_num) \
|
|
: "memory"); \
|
|
ret; \
|
|
}) \
|
|
|
|
#define csr_write_allowed(csr_num, trap, value) \
|
|
({ \
|
|
register ulong tinfo asm("a3") = (ulong)trap; \
|
|
register ulong ttmp asm("a4"); \
|
|
register ulong mtvec = sbi_hart_expected_trap_addr(); \
|
|
((struct sbi_trap_info *)(trap))->cause = 0; \
|
|
asm volatile( \
|
|
"add %[ttmp], %[tinfo], zero\n" \
|
|
"csrrw %[mtvec], " STR(CSR_MTVEC) ", %[mtvec]\n" \
|
|
"csrw %[csr], %[val]\n" \
|
|
"csrw " STR(CSR_MTVEC) ", %[mtvec]" \
|
|
: [mtvec] "+&r"(mtvec), \
|
|
[tinfo] "+&r"(tinfo), [ttmp] "+&r"(ttmp) \
|
|
: [csr] "i" (csr_num), [val] "r" (value) \
|
|
: "memory"); \
|
|
}) \
|
|
|
|
#endif
|