On Thu, Jan 18, 2018 at 07:11:41PM +1100, Alexey Kardashevskiy wrote: > On 18/01/18 16:53, David Gibson wrote: > > 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. > > "oops"
Thereby making what is definitely a qemu bug appear to be a guest problem. -- 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