On 18/01/18 16:20, David Gibson wrote: > On Mon, Jan 15, 2018 at 05:32:35PM +1100, Suraj Jitindar Singh wrote: >> The new H-Call H_GET_CPU_CHARACTERISTICS is used by the guest to query >> behaviours and available characteristics of the cpu. >> >> Implement the handler for this new H-Call which formulates its response >> based on the setting of the spapr_caps cap-cfpc, cap-sbbc and cap-ibs. >> >> Signed-off-by: Suraj Jitindar Singh <sjitindarsi...@gmail.com> >> --- >> hw/ppc/spapr_hcall.c | 66 >> ++++++++++++++++++++++++++++++++++++++++++++++++++ >> include/hw/ppc/spapr.h | 1 + >> 2 files changed, 67 insertions(+) >> >> diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c >> index 51eba52e86..a693d3b852 100644 >> --- a/hw/ppc/spapr_hcall.c >> +++ b/hw/ppc/spapr_hcall.c >> @@ -1654,6 +1654,69 @@ static target_ulong >> h_client_architecture_support(PowerPCCPU *cpu, >> return H_SUCCESS; >> } >> >> +static target_ulong h_get_cpu_characteristics(PowerPCCPU *cpu, >> + sPAPRMachineState *spapr, >> + target_ulong opcode, >> + target_ulong *args) >> +{ >> + uint64_t characteristics = H_CPU_CHAR_HON_BRANCH_HINTS & >> + ~H_CPU_CHAR_THR_RECONF_TRIG; >> + uint64_t behaviour = H_CPU_BEHAV_FAVOUR_SECURITY; >> + uint8_t safe_cache = spapr_get_cap(spapr, SPAPR_CAP_CFPC); >> + uint8_t safe_bounds_check = spapr_get_cap(spapr, SPAPR_CAP_SBBC); >> + uint8_t safe_indirect_branch = spapr_get_cap(spapr, SPAPR_CAP_IBS); >> + >> + switch (safe_cache) { >> + case SPAPR_CAP_WORKAROUND: >> + characteristics |= H_CPU_CHAR_L1D_FLUSH_ORI30; >> + characteristics |= H_CPU_CHAR_L1D_FLUSH_TRIG2; >> + characteristics |= H_CPU_CHAR_L1D_THREAD_PRIV; >> + behaviour |= H_CPU_BEHAV_L1D_FLUSH_PR; >> + break; >> + case SPAPR_CAP_FIXED: >> + break; >> + default: /* broken */ >> + if (safe_cache != SPAPR_CAP_BROKEN) { > > I think you just assert() for this. The only way these could get a > different value is if there's a bug elsewhere.
Why not return H_HARDWARE or other error? -- Alexey
signature.asc
Description: OpenPGP digital signature