On Thu, Jan 18, 2018 at 04:44:28PM +1100, Alexey Kardashevskiy wrote: > 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?
Because what's the guest supposed to do with it. This is an internal qemu problem, so it should be dealt with via an internal qemu mechanism. -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
signature.asc
Description: PGP signature