On 19.11.2013, at 05:28, Alexey Kardashevskiy <a...@ozlabs.ru> wrote:
> This adds very basic handlers for ibm,get-system-parameter and > ibm,set-system-parameter RTAS calls. > > The only parameter handled at the moment is > "platform-processor-diagnostics-run-mode" which is always disabled and > does not support changing. This is expected to make > "ppc64_cpu --run-mode=1" happy. > > Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru> > --- > Changes: > v3: > * reworked all return codes (in a separate patch) > > v2: > * addressed comments from Alex Graf > --- > hw/ppc/spapr_rtas.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ > include/hw/ppc/spapr.h | 2 ++ > 2 files changed, 49 insertions(+) > > diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c > index f9897a5..d7b1f1d 100644 > --- a/hw/ppc/spapr_rtas.c > +++ b/hw/ppc/spapr_rtas.c > @@ -224,6 +224,49 @@ static void rtas_stop_self(PowerPCCPU *cpu, > sPAPREnvironment *spapr, > env->msr = 0; > } > > +#define DIAGNOSTICS_RUN_MODE 42 > + > +static void rtas_ibm_get_system_parameter(PowerPCCPU *cpu, > + sPAPREnvironment *spapr, > + uint32_t token, uint32_t nargs, > + target_ulong args, > + uint32_t nret, target_ulong rets) > +{ > + target_ulong papameter = rtas_ld(args, 0); Sorry, saw that one too late. What is a papameter? Is it related to the pope? :) > + target_ulong buffer = rtas_ld(args, 1); > + target_ulong length = rtas_ld(args, 2); > + target_ulong ret = RTAS_OUT_NOT_SUPPORTED; > + > + switch (papameter) { > + case DIAGNOSTICS_RUN_MODE: > + if (length == 1) { > + rtas_st(buffer, 0, 0); > + ret = RTAS_OUT_SUCCESS; > + } > + break; > + } > + > + rtas_st(rets, 0, ret); > +} > + > +static void rtas_ibm_set_system_parameter(PowerPCCPU *cpu, > + sPAPREnvironment *spapr, > + uint32_t token, uint32_t nargs, > + target_ulong args, > + uint32_t nret, target_ulong rets) > +{ > + target_ulong papameter = rtas_ld(args, 0); Here too Alex > + target_ulong ret = RTAS_OUT_NOT_SUPPORTED; > + > + switch (papameter) { > + case DIAGNOSTICS_RUN_MODE: > + ret = RTAS_OUT_NOT_AUTHORIZED; > + break; > + } > + > + rtas_st(rets, 0, ret); > +} > + > static struct rtas_call { > const char *name; > spapr_rtas_fn fn; > @@ -345,6 +388,10 @@ static void core_rtas_register_types(void) > rtas_query_cpu_stopped_state); > spapr_rtas_register("start-cpu", rtas_start_cpu); > spapr_rtas_register("stop-self", rtas_stop_self); > + spapr_rtas_register("ibm,get-system-parameter", > + rtas_ibm_get_system_parameter); > + spapr_rtas_register("ibm,set-system-parameter", > + rtas_ibm_set_system_parameter); > } > > type_init(core_rtas_register_types) > diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h > index 085cfa7..b2f11e9 100644 > --- a/include/hw/ppc/spapr.h > +++ b/include/hw/ppc/spapr.h > @@ -338,6 +338,8 @@ static inline int spapr_allocate_lsi(int hint) > #define RTAS_OUT_HW_ERROR -1 > #define RTAS_OUT_BUSY -2 > #define RTAS_OUT_PARAM_ERROR -3 > +#define RTAS_OUT_NOT_SUPPORTED -3 > +#define RTAS_OUT_NOT_AUTHORIZED -9002 > > static inline uint64_t ppc64_phys_to_real(uint64_t addr) > { > -- > 1.8.4.rc4 >