Currently, we have two output parameters in a SBI extension handler
namely "out_val" and "out_trap". If we add more output parameters
then SBI extension handler prototype will also grow further.
To have a fixed SBI extension handler prototype, we introduce new
"struct cpu_vcpu_sbi_return" which combines all output parameters
of a SBI extension handler and pass a pointer to this new struct
as parameter.
arch/riscv/cpu/generic/cpu_vcpu_sbi.c | 7 ++---
arch/riscv/cpu/generic/cpu_vcpu_sbi_base.c | 25 ++++++++---------
arch/riscv/cpu/generic/cpu_vcpu_sbi_hsm.c | 11 ++++----
arch/riscv/cpu/generic/cpu_vcpu_sbi_legacy.c | 17 +++++------
arch/riscv/cpu/generic/cpu_vcpu_sbi_replace.c | 28 ++++++++-----------
arch/riscv/cpu/generic/cpu_vcpu_sbi_xvisor.c | 9 +++---
arch/riscv/cpu/generic/include/cpu_vcpu_sbi.h | 12 +++++---
7 files changed, 53 insertions(+), 56 deletions(-)
diff --git a/arch/riscv/cpu/generic/cpu_vcpu_sbi.c b/arch/riscv/cpu/generic/cpu_vcpu_sbi.c
index 23a26b09..5603858d 100644
--- a/arch/riscv/cpu/generic/cpu_vcpu_sbi.c
+++ b/arch/riscv/cpu/generic/cpu_vcpu_sbi.c
@@ -70,7 +70,7 @@ int cpu_vcpu_sbi_ecall(struct vmm_vcpu *vcpu, ulong cause,
unsigned long extension_id = regs->a7;
unsigned long func_id = regs->a6;
struct cpu_vcpu_trap trap = { 0 };
- unsigned long out_val = 0;
+ struct cpu_vcpu_sbi_return out = { .value = 0, .trap = &trap };
bool is_0_1_spec = FALSE;
unsigned long args[6];
@@ -95,8 +95,7 @@ int cpu_vcpu_sbi_ecall(struct vmm_vcpu *vcpu, ulong cause,
ext = cpu_vcpu_sbi_find_extension(extension_id);
if (ext && ext->handle) {
- ret = ext->handle(vcpu, extension_id, func_id,
- args, &out_val, &trap);
+ ret = ext->handle(vcpu, extension_id, func_id, args, &out);
if (extension_id >= SBI_EXT_0_1_SET_TIMER &&
extension_id <= SBI_EXT_0_1_SHUTDOWN)
is_0_1_spec = TRUE;
@@ -118,7 +117,7 @@ int cpu_vcpu_sbi_ecall(struct vmm_vcpu *vcpu, ulong cause,
regs->sepc += 4;
regs->a0 = ret;
if (!is_0_1_spec)
- regs->a1 = out_val;
+ regs->a1 = out.value;
}
return 0;
diff --git a/arch/riscv/cpu/generic/cpu_vcpu_sbi_base.c b/arch/riscv/cpu/generic/cpu_vcpu_sbi_base.c
index f14eaef7..e5b05da8 100644
--- a/arch/riscv/cpu/generic/cpu_vcpu_sbi_base.c
+++ b/arch/riscv/cpu/generic/cpu_vcpu_sbi_base.c
@@ -29,37 +29,36 @@
#include <cpu_vcpu_sbi.h>
#include <riscv_sbi.h>
-static int vcpu_sbi_base_ecall(struct vmm_vcpu *vcpu,
- unsigned long ext_id, unsigned long func_id,
- unsigned long *args, unsigned long *out_val,
- struct cpu_vcpu_trap *out_trap)
+static int vcpu_sbi_base_ecall(struct vmm_vcpu *vcpu, unsigned long ext_id,
+ unsigned long func_id, unsigned long *args,
+ struct cpu_vcpu_sbi_return *out)
{
int ret = 0;
struct sbiret hret;
switch (func_id) {
case SBI_EXT_BASE_GET_SPEC_VERSION:
- *out_val = (CPU_VCPU_SBI_VERSION_MAJOR <<
- SBI_SPEC_VERSION_MAJOR_SHIFT) |
- CPU_VCPU_SBI_VERSION_MINOR;
+ out->value = (CPU_VCPU_SBI_VERSION_MAJOR <<
+ SBI_SPEC_VERSION_MAJOR_SHIFT) |
+ CPU_VCPU_SBI_VERSION_MINOR;
break;
case SBI_EXT_BASE_GET_IMP_ID:
- *out_val = CPU_VCPU_SBI_IMPID;
+ out->value = CPU_VCPU_SBI_IMPID;
break;
case SBI_EXT_BASE_GET_IMP_VERSION:
- *out_val = VMM_VERSION_MAJOR << 24 |
- VMM_VERSION_MINOR << 12 |
- VMM_VERSION_RELEASE;
+ out->value = VMM_VERSION_MAJOR << 24 |
+ VMM_VERSION_MINOR << 12 |
+ VMM_VERSION_RELEASE;
break;
case SBI_EXT_BASE_GET_MVENDORID:
case SBI_EXT_BASE_GET_MARCHID:
case SBI_EXT_BASE_GET_MIMPID:
hret = sbi_ecall(SBI_EXT_BASE, func_id, 0, 0, 0, 0, 0, 0);
ret = hret.error;
- *out_val = hret.value;
+ out->value = hret.value;
break;
case SBI_EXT_BASE_PROBE_EXT:
- *out_val = (cpu_vcpu_sbi_find_extension(args[0])) ? 1 : 0;
+ out->value = (cpu_vcpu_sbi_find_extension(args[0])) ? 1 : 0;
break;
default:
ret = SBI_ERR_NOT_SUPPORTED;
diff --git a/arch/riscv/cpu/generic/cpu_vcpu_sbi_hsm.c b/arch/riscv/cpu/generic/cpu_vcpu_sbi_hsm.c
index f965e6f0..f3e54d1c 100644
--- a/arch/riscv/cpu/generic/cpu_vcpu_sbi_hsm.c
+++ b/arch/riscv/cpu/generic/cpu_vcpu_sbi_hsm.c
@@ -29,10 +29,9 @@
#include <cpu_vcpu_sbi.h>
#include <riscv_sbi.h>
-static int vcpu_sbi_hsm_ecall(struct vmm_vcpu *vcpu,
- unsigned long ext_id, unsigned long func_id,
- unsigned long *args, unsigned long *out_val,
- struct cpu_vcpu_trap *out_trap)
+static int vcpu_sbi_hsm_ecall(struct vmm_vcpu *vcpu, unsigned long ext_id,
+ unsigned long func_id, unsigned long *args,
+ struct cpu_vcpu_sbi_return *out)
{
int rc;
u32 reg_flags = 0x0;
@@ -68,9 +67,9 @@ static int vcpu_sbi_hsm_ecall(struct vmm_vcpu *vcpu,
if (!rvcpu)
return SBI_ERR_INVALID_PARAM;
if (vmm_manager_vcpu_get_state(rvcpu) != VMM_VCPU_STATE_RESET)
- *out_val = SBI_HSM_STATE_STARTED;
+ out->value = SBI_HSM_STATE_STARTED;
else
- *out_val = SBI_HSM_STATE_STOPPED;
+ out->value = SBI_HSM_STATE_STOPPED;
break;
case SBI_EXT_HSM_HART_SUSPEND:
if (args[0] == SBI_HSM_SUSPEND_RET_DEFAULT) {
diff --git a/arch/riscv/cpu/generic/cpu_vcpu_sbi_legacy.c b/arch/riscv/cpu/generic/cpu_vcpu_sbi_legacy.c
index d25acf0b..57720c6d 100644
--- a/arch/riscv/cpu/generic/cpu_vcpu_sbi_legacy.c
+++ b/arch/riscv/cpu/generic/cpu_vcpu_sbi_legacy.c
@@ -35,10 +35,9 @@
#include <cpu_tlb.h>
#include <riscv_sbi.h>
-static int vcpu_sbi_legacy_ecall(struct vmm_vcpu *vcpu,
- unsigned long ext_id, unsigned long func_id,
- unsigned long *args, unsigned long *out_val,
- struct cpu_vcpu_trap *out_trap)
+static int vcpu_sbi_legacy_ecall(struct vmm_vcpu *vcpu, unsigned long ext_id,
+ unsigned long func_id, unsigned long *args,
+ struct cpu_vcpu_sbi_return *out)
{
u8 send;
u32 hcpu;
@@ -70,10 +69,11 @@ static int vcpu_sbi_legacy_ecall(struct vmm_vcpu *vcpu,
break;
case SBI_EXT_0_1_SEND_IPI:
if (args[0])
- hmask = __cpu_vcpu_unpriv_read_ulong(args[0], out_trap);
+ hmask = __cpu_vcpu_unpriv_read_ulong(args[0],
+ out->trap);
else
hmask = (1UL << guest->vcpu_count) - 1;
- if (out_trap->scause) {
+ if (out->trap->scause) {
break;
}
for_each_set_bit(i, &hmask, BITS_PER_LONG) {
@@ -97,10 +97,11 @@ static int vcpu_sbi_legacy_ecall(struct vmm_vcpu *vcpu,
case SBI_EXT_0_1_REMOTE_SFENCE_VMA:
case SBI_EXT_0_1_REMOTE_SFENCE_VMA_ASID:
if (args[0])
- hmask = __cpu_vcpu_unpriv_read_ulong(args[0], out_trap);
+ hmask = __cpu_vcpu_unpriv_read_ulong(args[0],
+ out->trap);
else
hmask = (1UL << guest->vcpu_count) - 1;
- if (out_trap->scause) {
+ if (out->trap->scause) {
break;
}
vmm_cpumask_clear(&cm);
diff --git a/arch/riscv/cpu/generic/cpu_vcpu_sbi_replace.c b/arch/riscv/cpu/generic/cpu_vcpu_sbi_replace.c
index 4c5cb44c..7502c0b2 100644
--- a/arch/riscv/cpu/generic/cpu_vcpu_sbi_replace.c
+++ b/arch/riscv/cpu/generic/cpu_vcpu_sbi_replace.c
@@ -33,10 +33,9 @@
#include <generic_mmu.h>
#include <riscv_sbi.h>
-static int vcpu_sbi_time_ecall(struct vmm_vcpu *vcpu,
- unsigned long ext_id, unsigned long func_id,
- unsigned long *args, unsigned long *out_val,
- struct cpu_vcpu_trap *out_trap)
+static int vcpu_sbi_time_ecall(struct vmm_vcpu *vcpu, unsigned long ext_id,
+ unsigned long func_id, unsigned long *args,
+ struct cpu_vcpu_sbi_return *out)
{
if (func_id != SBI_EXT_TIME_SET_TIMER)
return SBI_ERR_NOT_SUPPORTED;
@@ -56,10 +55,9 @@ const struct cpu_vcpu_sbi_extension vcpu_sbi_time = {
.handle = vcpu_sbi_time_ecall,
};
-static int vcpu_sbi_rfence_ecall(struct vmm_vcpu *vcpu,
- unsigned long ext_id, unsigned long func_id,
- unsigned long *args, unsigned long *out_val,
- struct cpu_vcpu_trap *out_trap)
+static int vcpu_sbi_rfence_ecall(struct vmm_vcpu *vcpu, unsigned long ext_id,
+ unsigned long func_id, unsigned long *args,
+ struct cpu_vcpu_sbi_return *out)
{
u32 hcpu;
struct vmm_vcpu *rvcpu;
@@ -163,10 +161,9 @@ const struct cpu_vcpu_sbi_extension vcpu_sbi_rfence = {
.handle = vcpu_sbi_rfence_ecall,
};
-static int vcpu_sbi_ipi_ecall(struct vmm_vcpu *vcpu,
- unsigned long ext_id, unsigned long func_id,
- unsigned long *args, unsigned long *out_val,
- struct cpu_vcpu_trap *out_trap)
+static int vcpu_sbi_ipi_ecall(struct vmm_vcpu *vcpu, unsigned long ext_id,
+ unsigned long func_id, unsigned long *args,
+ struct cpu_vcpu_sbi_return *out)
{
struct vmm_vcpu *rvcpu;
struct vmm_guest *guest = vcpu->guest;
@@ -197,10 +194,9 @@ const struct cpu_vcpu_sbi_extension vcpu_sbi_ipi = {
.handle = vcpu_sbi_ipi_ecall,
};
-static int vcpu_sbi_srst_ecall(struct vmm_vcpu *vcpu,
- unsigned long ext_id, unsigned long func_id,
- unsigned long *args, unsigned long *out_val,
- struct cpu_vcpu_trap *out_trap)
+static int vcpu_sbi_srst_ecall(struct vmm_vcpu *vcpu, unsigned long ext_id,
+ unsigned long func_id, unsigned long *args,
+ struct cpu_vcpu_sbi_return *out)
{
int ret;
struct vmm_guest *guest = vcpu->guest;
diff --git a/arch/riscv/cpu/generic/cpu_vcpu_sbi_xvisor.c b/arch/riscv/cpu/generic/cpu_vcpu_sbi_xvisor.c
index ef3b2664..3a4b20e9 100644
--- a/arch/riscv/cpu/generic/cpu_vcpu_sbi_xvisor.c
+++ b/arch/riscv/cpu/generic/cpu_vcpu_sbi_xvisor.c
@@ -35,15 +35,14 @@
#define SBI_EXT_XVISOR_ISA_EXT 0x0
-static int vcpu_sbi_xvisor_ecall(struct vmm_vcpu *vcpu,
- unsigned long ext_id, unsigned long func_id,
- unsigned long *args, unsigned long *out_val,
- struct cpu_vcpu_trap *out_trap)
+static int vcpu_sbi_xvisor_ecall(struct vmm_vcpu *vcpu, unsigned long ext_id,
+ unsigned long func_id, unsigned long *args,
+ struct cpu_vcpu_sbi_return *out)
{
switch (func_id) {
case SBI_EXT_XVISOR_ISA_EXT:
if (args[0] < RISCV_ISA_EXT_MAX) {
- *out_val = __riscv_isa_extension_available(
+ out->value = __riscv_isa_extension_available(
riscv_priv(vcpu)->isa,
args[0]);
} else {
diff --git a/arch/riscv/cpu/generic/include/cpu_vcpu_sbi.h b/arch/riscv/cpu/generic/include/cpu_vcpu_sbi.h
index 3a11e150..5de73aab 100644
--- a/arch/riscv/cpu/generic/include/cpu_vcpu_sbi.h
+++ b/arch/riscv/cpu/generic/include/cpu_vcpu_sbi.h
@@ -32,13 +32,17 @@ struct cpu_vcpu_trap;
#define CPU_VCPU_SBI_VERSION_MINOR 3
#define CPU_VCPU_SBI_IMPID 2
+struct cpu_vcpu_sbi_return {
+ unsigned long value;
+ struct cpu_vcpu_trap *trap;
+};
+
struct cpu_vcpu_sbi_extension {
unsigned long extid_start;
unsigned long extid_end;
- int (*handle)(struct vmm_vcpu *vcpu,
- unsigned long ext_id, unsigned long func_id,
- unsigned long *args, unsigned long *out_val,
- struct cpu_vcpu_trap *out_trap);
+ int (*handle)(struct vmm_vcpu *vcpu, unsigned long ext_id,
+ unsigned long func_id, unsigned long *args,
+ struct cpu_vcpu_sbi_return *out);
};
const struct cpu_vcpu_sbi_extension *cpu_vcpu_sbi_find_extension(
--
2.34.1