powerpc/spapr: Add host threads parameter to ibm,get_system_parameter
The ibm,get_system_parameter rtas call is used by the guest to retrieve data relating to certain parameters of the system. The SPLPAR characteristics option (token 20) is used to determine characteristics of the environment in which the lpar will run. It may be useful for a guest to know the number of physical host threads present on the underlying system where it is being run. Add the characteristic "HostThrs" to the SPLPAR Characteristics ibm,get_system_parameter rtas call to expose this information to a guest. Add a n_host_threads property to the processor class which is then used to retrieve this information and define it for POWER8 and POWER9. Other processors will default to 0 and the charateristic won't be added. Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com> Message-Id: <20190827045751.22123-1-sjitindarsingh@gmail.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
00eaad2e29
commit
289af4ac99
@ -266,6 +266,7 @@ static void rtas_ibm_get_system_parameter(PowerPCCPU *cpu,
|
|||||||
target_ulong args,
|
target_ulong args,
|
||||||
uint32_t nret, target_ulong rets)
|
uint32_t nret, target_ulong rets)
|
||||||
{
|
{
|
||||||
|
PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
|
||||||
MachineState *ms = MACHINE(qdev_get_machine());
|
MachineState *ms = MACHINE(qdev_get_machine());
|
||||||
unsigned int max_cpus = ms->smp.max_cpus;
|
unsigned int max_cpus = ms->smp.max_cpus;
|
||||||
target_ulong parameter = rtas_ld(args, 0);
|
target_ulong parameter = rtas_ld(args, 0);
|
||||||
@ -283,6 +284,20 @@ static void rtas_ibm_get_system_parameter(PowerPCCPU *cpu,
|
|||||||
current_machine->ram_size / MiB,
|
current_machine->ram_size / MiB,
|
||||||
ms->smp.cpus,
|
ms->smp.cpus,
|
||||||
max_cpus);
|
max_cpus);
|
||||||
|
if (pcc->n_host_threads > 0) {
|
||||||
|
char *hostthr_val, *old = param_val;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add HostThrs property. This property is not present in PAPR but
|
||||||
|
* is expected by some guests to communicate the number of physical
|
||||||
|
* host threads per core on the system so that they can scale
|
||||||
|
* information which varies based on the thread configuration.
|
||||||
|
*/
|
||||||
|
hostthr_val = g_strdup_printf(",HostThrs=%d", pcc->n_host_threads);
|
||||||
|
param_val = g_strconcat(param_val, hostthr_val, NULL);
|
||||||
|
g_free(hostthr_val);
|
||||||
|
g_free(old);
|
||||||
|
}
|
||||||
ret = sysparm_st(buffer, length, param_val, strlen(param_val) + 1);
|
ret = sysparm_st(buffer, length, param_val, strlen(param_val) + 1);
|
||||||
g_free(param_val);
|
g_free(param_val);
|
||||||
break;
|
break;
|
||||||
|
@ -191,6 +191,7 @@ typedef struct PowerPCCPUClass {
|
|||||||
const PPCHash64Options *hash64_opts;
|
const PPCHash64Options *hash64_opts;
|
||||||
struct ppc_radix_page_info *radix_page_info;
|
struct ppc_radix_page_info *radix_page_info;
|
||||||
uint32_t lrg_decr_bits;
|
uint32_t lrg_decr_bits;
|
||||||
|
int n_host_threads;
|
||||||
void (*init_proc)(CPUPPCState *env);
|
void (*init_proc)(CPUPPCState *env);
|
||||||
int (*check_pow)(CPUPPCState *env);
|
int (*check_pow)(CPUPPCState *env);
|
||||||
int (*handle_mmu_fault)(PowerPCCPU *cpu, vaddr eaddr, int rwx, int mmu_idx);
|
int (*handle_mmu_fault)(PowerPCCPU *cpu, vaddr eaddr, int rwx, int mmu_idx);
|
||||||
|
@ -8770,6 +8770,7 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
|
|||||||
pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
|
pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
|
||||||
pcc->hash64_opts = &ppc_hash64_opts_POWER7;
|
pcc->hash64_opts = &ppc_hash64_opts_POWER7;
|
||||||
pcc->lrg_decr_bits = 32;
|
pcc->lrg_decr_bits = 32;
|
||||||
|
pcc->n_host_threads = 8;
|
||||||
#endif
|
#endif
|
||||||
pcc->excp_model = POWERPC_EXCP_POWER8;
|
pcc->excp_model = POWERPC_EXCP_POWER8;
|
||||||
pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
|
pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
|
||||||
@ -8981,6 +8982,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
|
|||||||
pcc->hash64_opts = &ppc_hash64_opts_POWER7;
|
pcc->hash64_opts = &ppc_hash64_opts_POWER7;
|
||||||
pcc->radix_page_info = &POWER9_radix_page_info;
|
pcc->radix_page_info = &POWER9_radix_page_info;
|
||||||
pcc->lrg_decr_bits = 56;
|
pcc->lrg_decr_bits = 56;
|
||||||
|
pcc->n_host_threads = 4;
|
||||||
#endif
|
#endif
|
||||||
pcc->excp_model = POWERPC_EXCP_POWER9;
|
pcc->excp_model = POWERPC_EXCP_POWER9;
|
||||||
pcc->bus_model = PPC_FLAGS_INPUT_POWER9;
|
pcc->bus_model = PPC_FLAGS_INPUT_POWER9;
|
||||||
|
Loading…
Reference in New Issue
Block a user