Skip to content

Commit

Permalink
spapr: nested: move nested part of spapr_get_pate into spapr_nested.c
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Harsh Prateek Bora authored and npiggin committed Mar 12, 2024
1 parent 6026fdb commit c2813a3
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 27 deletions.
28 changes: 2 additions & 26 deletions hw/ppc/spapr.c
Original file line number Diff line number Diff line change
Expand Up @@ -1407,7 +1407,6 @@ void spapr_init_all_lpcrs(target_ulong value, target_ulong mask)
}
}


static bool spapr_get_pate(PPCVirtualHypervisor *vhyp, PowerPCCPU *cpu,
target_ulong lpid, ppc_v3_pate_t *entry)
{
Expand All @@ -1420,33 +1419,10 @@ static bool spapr_get_pate(PPCVirtualHypervisor *vhyp, PowerPCCPU *cpu,
/* Copy PATE1:GR into PATE0:HR */
entry->dw0 = spapr->patb_entry & PATE0_HR;
entry->dw1 = spapr->patb_entry;

return true;
} else {
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 spapr_get_pate_nested_hv(spapr, cpu, lpid, entry);
}

return true;
}

#define HPTE(_table, _i) (void *)(((uint64_t *)(_table)) + ((_i) * 2))
Expand Down
36 changes: 36 additions & 0 deletions hw/ppc/spapr_nested.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "hw/ppc/spapr.h"
#include "hw/ppc/spapr_cpu_core.h"
#include "hw/ppc/spapr_nested.h"
#include "mmu-book3s-v3.h"

void spapr_nested_reset(SpaprMachineState *spapr)
{
Expand All @@ -16,6 +17,35 @@ void spapr_nested_reset(SpaprMachineState *spapr)
}

#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

static target_ulong h_set_ptbl(PowerPCCPU *cpu,
Expand Down Expand Up @@ -413,4 +443,10 @@ void spapr_unregister_nested_hv(void)
{
/* DO NOTHING */
}

bool spapr_get_pate_nested_hv(SpaprMachineState *spapr, PowerPCCPU *cpu,
target_ulong lpid, ppc_v3_pate_t *entry)
{
return false;
}
#endif
3 changes: 2 additions & 1 deletion include/hw/ppc/spapr_nested.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,5 +96,6 @@ struct nested_ppc_state {
};

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 */

0 comments on commit c2813a3

Please sign in to comment.