Hi all, rtas_ibm_get_system_parameter did not previously have the functionality to return the appropriate string when called with the SPLPAR_CHARACTERISTICS_TOKEN. I am proposing the following patch to add that functionality. I am including the cases for CMO_CHARACTERISTICS_TOKEN and CEDE_LATENCY_TOKEN because the function gets called with those tokens during the boot process, but I understand that they are currently redundant with the default case. I just figured they would be useful for future development, but if we don't want them in there right now I think that would be okay, too.
Regards, Tomo Berry diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c index 1cb276d..318fdcd 100644 --- a/hw/ppc/spapr_rtas.c +++ b/hw/ppc/spapr_rtas.c @@ -225,6 +225,9 @@ static void rtas_stop_self(PowerPCCPU *cpu, sPAPREnvironment *spapr, } #define DIAGNOSTICS_RUN_MODE 42 +#define SPLPAR_CHARACTERISTICS_TOKEN 20 +#define CMO_CHARACTERISTICS_TOKEN 44 +#define CEDE_LATENCY_TOKEN 45 static void rtas_ibm_get_system_parameter(PowerPCCPU *cpu, sPAPREnvironment *spapr, @@ -236,6 +239,7 @@ static void rtas_ibm_get_system_parameter(PowerPCCPU *cpu, target_ulong buffer = rtas_ld(args, 1); target_ulong length = rtas_ld(args, 2); target_ulong ret = RTAS_OUT_NOT_SUPPORTED; + char *local_buffer; switch (parameter) { case DIAGNOSTICS_RUN_MODE: @@ -244,6 +248,42 @@ static void rtas_ibm_get_system_parameter(PowerPCCPU *cpu, ret = RTAS_OUT_SUCCESS; } break; + case SPLPAR_CHARACTERISTICS_TOKEN: + + /* Create a string locally to copy to buffer */ + + local_buffer=(char*)malloc(length*sizeof(char)); + memset(local_buffer,0,length); + + /* These are the current system parameters supported. The spaces at the + * start of the string are place holders for the string length. */ + + snprintf(local_buffer,length," MaxEntCap=%d,MaxPlatProcs=%d",max_cpus,smp_cpus); + + /* The first 16 bits of the buffer must contain the length of the string. + * These 16 bits are not included in the length of the string. */ + + ((uint16_t*)local_buffer)[0]=cpu_to_be16((uint16_t)strlen(&local_buffer[2])); + + /* Copy the string into buffer using rtas_st_buffer to + * convert the addresses. */ + + rtas_st_buffer(buffer,length,(uint8_t*)local_buffer); + + /* Free the local buffer and return success. */ + + free(local_buffer); + ret = RTAS_OUT_SUCCESS; + break; + case CMO_CHARACTERISTICS_TOKEN: + ret = RTAS_OUT_NOT_SUPPORTED; + break; + case CEDE_LATENCY_TOKEN: + ret = RTAS_OUT_NOT_SUPPORTED; + break; + default: + ret = RTAS_OUT_NOT_SUPPORTED; + break; } rtas_st(rets, 0, ret); diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index b2f11e9..87c039c 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -356,6 +356,16 @@ static inline void rtas_st(target_ulong phys, int n, uint32_t val) stl_be_phys(ppc64_phys_to_real(phys + 4*n), val); } +/* This function will store a buffer 1 byte at a time into the + * address at phys up to a maximum of phys_len bytes. */ + +static inline void rtas_st_buffer(target_ulong phys, target_ulong phys_len, uint8_t* buffer){ + uint32_t i; + for(i=0;i<phys_len;i++){ + stb_phys(ppc64_phys_to_real(phys + i),buffer[i]); + } +} + typedef void (*spapr_rtas_fn)(PowerPCCPU *cpu, sPAPREnvironment *spapr, uint32_t token, uint32_t nargs, target_ulong args, diff --git a/pixman b/pixman --- a/pixman +++ b/pixman @@ -1 +1 @@ -Subproject commit 97336fad32acf802003855cd8bd6477fa49a12e3 +Subproject commit 97336fad32acf802003855cd8bd6477fa49a12e3-dirty