spapr: nested: move nested part of spapr_get_pate into spapr_nested.c

Most of the nested code has already been moved to spapr_nested.c
This logic inside spapr_get_pate is related to nested guests and
better suited for spapr_nested.c, hence moving there.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Harsh Prateek Bora <harshpb@linux.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
This commit is contained in:
Harsh Prateek Bora 2024-03-08 16:49:28 +05:30 committed by Nicholas Piggin
parent 6026fdbdbd
commit c2813a3570
3 changed files with 40 additions and 27 deletions

View File

@ -1407,7 +1407,6 @@ void spapr_init_all_lpcrs(target_ulong value, target_ulong mask)
} }
} }
static bool spapr_get_pate(PPCVirtualHypervisor *vhyp, PowerPCCPU *cpu, static bool spapr_get_pate(PPCVirtualHypervisor *vhyp, PowerPCCPU *cpu,
target_ulong lpid, ppc_v3_pate_t *entry) target_ulong lpid, ppc_v3_pate_t *entry)
{ {
@ -1420,33 +1419,10 @@ static bool spapr_get_pate(PPCVirtualHypervisor *vhyp, PowerPCCPU *cpu,
/* Copy PATE1:GR into PATE0:HR */ /* Copy PATE1:GR into PATE0:HR */
entry->dw0 = spapr->patb_entry & PATE0_HR; entry->dw0 = spapr->patb_entry & PATE0_HR;
entry->dw1 = spapr->patb_entry; entry->dw1 = spapr->patb_entry;
return true;
} else { } else {
uint64_t patb, pats; return spapr_get_pate_nested_hv(spapr, cpu, lpid, entry);
assert(lpid != 0);
patb = spapr->nested_ptcr & PTCR_PATB;
pats = spapr->nested_ptcr & PTCR_PATS;
/* Check if partition table is properly aligned */
if (patb & MAKE_64BIT_MASK(0, pats + 12)) {
return false;
}
/* Calculate number of entries */
pats = 1ull << (pats + 12 - 4);
if (pats <= lpid) {
return false;
}
/* Grab entry */
patb += 16 * lpid;
entry->dw0 = ldq_phys(CPU(cpu)->as, patb);
entry->dw1 = ldq_phys(CPU(cpu)->as, patb + 8);
} }
return true;
} }
#define HPTE(_table, _i) (void *)(((uint64_t *)(_table)) + ((_i) * 2)) #define HPTE(_table, _i) (void *)(((uint64_t *)(_table)) + ((_i) * 2))

View File

@ -6,6 +6,7 @@
#include "hw/ppc/spapr.h" #include "hw/ppc/spapr.h"
#include "hw/ppc/spapr_cpu_core.h" #include "hw/ppc/spapr_cpu_core.h"
#include "hw/ppc/spapr_nested.h" #include "hw/ppc/spapr_nested.h"
#include "mmu-book3s-v3.h"
void spapr_nested_reset(SpaprMachineState *spapr) void spapr_nested_reset(SpaprMachineState *spapr)
{ {
@ -16,6 +17,35 @@ void spapr_nested_reset(SpaprMachineState *spapr)
} }
#ifdef CONFIG_TCG #ifdef CONFIG_TCG
bool spapr_get_pate_nested_hv(SpaprMachineState *spapr, PowerPCCPU *cpu,
target_ulong lpid, ppc_v3_pate_t *entry)
{
uint64_t patb, pats;
assert(lpid != 0);
patb = spapr->nested_ptcr & PTCR_PATB;
pats = spapr->nested_ptcr & PTCR_PATS;
/* Check if partition table is properly aligned */
if (patb & MAKE_64BIT_MASK(0, pats + 12)) {
return false;
}
/* Calculate number of entries */
pats = 1ull << (pats + 12 - 4);
if (pats <= lpid) {
return false;
}
/* Grab entry */
patb += 16 * lpid;
entry->dw0 = ldq_phys(CPU(cpu)->as, patb);
entry->dw1 = ldq_phys(CPU(cpu)->as, patb + 8);
return true;
}
#define PRTS_MASK 0x1f #define PRTS_MASK 0x1f
static target_ulong h_set_ptbl(PowerPCCPU *cpu, static target_ulong h_set_ptbl(PowerPCCPU *cpu,
@ -413,4 +443,10 @@ void spapr_unregister_nested_hv(void)
{ {
/* DO NOTHING */ /* DO NOTHING */
} }
bool spapr_get_pate_nested_hv(SpaprMachineState *spapr, PowerPCCPU *cpu,
target_ulong lpid, ppc_v3_pate_t *entry)
{
return false;
}
#endif #endif

View File

@ -96,5 +96,6 @@ struct nested_ppc_state {
}; };
void spapr_exit_nested(PowerPCCPU *cpu, int excp); void spapr_exit_nested(PowerPCCPU *cpu, int excp);
bool spapr_get_pate_nested_hv(SpaprMachineState *spapr, PowerPCCPU *cpu,
target_ulong lpid, ppc_v3_pate_t *entry);
#endif /* HW_SPAPR_NESTED_H */ #endif /* HW_SPAPR_NESTED_H */