pseries: Implement h_read hcall
This h_call is useful for DLPAR in future amongst other things. Given an index it fetches the corresponding PTE stored in the htab. Signed-off-by: Erlon Cruz <erlon.cruz@br.flextronics.com> Acked-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
befa8af375
commit
6bbd5dde9a
@ -323,6 +323,36 @@ static target_ulong h_protect(PowerPCCPU *cpu, sPAPREnvironment *spapr,
|
|||||||
return H_SUCCESS;
|
return H_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static target_ulong h_read(PowerPCCPU *cpu, sPAPREnvironment *spapr,
|
||||||
|
target_ulong opcode, target_ulong *args)
|
||||||
|
{
|
||||||
|
CPUPPCState *env = &cpu->env;
|
||||||
|
target_ulong flags = args[0];
|
||||||
|
target_ulong pte_index = args[1];
|
||||||
|
uint8_t *hpte;
|
||||||
|
int i, ridx, n_entries = 1;
|
||||||
|
|
||||||
|
if ((pte_index * HASH_PTE_SIZE_64) & ~env->htab_mask) {
|
||||||
|
return H_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & H_READ_4) {
|
||||||
|
/* Clear the two low order bits */
|
||||||
|
pte_index &= ~(3ULL);
|
||||||
|
n_entries = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
hpte = env->external_htab + (pte_index * HASH_PTE_SIZE_64);
|
||||||
|
|
||||||
|
for (i = 0, ridx = 0; i < n_entries; i++) {
|
||||||
|
args[ridx++] = ldq_p(hpte);
|
||||||
|
args[ridx++] = ldq_p(hpte + (HASH_PTE_SIZE_64/2));
|
||||||
|
hpte += HASH_PTE_SIZE_64;
|
||||||
|
}
|
||||||
|
|
||||||
|
return H_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static target_ulong h_set_dabr(PowerPCCPU *cpu, sPAPREnvironment *spapr,
|
static target_ulong h_set_dabr(PowerPCCPU *cpu, sPAPREnvironment *spapr,
|
||||||
target_ulong opcode, target_ulong *args)
|
target_ulong opcode, target_ulong *args)
|
||||||
{
|
{
|
||||||
@ -710,6 +740,7 @@ static void hypercall_register_types(void)
|
|||||||
spapr_register_hypercall(H_ENTER, h_enter);
|
spapr_register_hypercall(H_ENTER, h_enter);
|
||||||
spapr_register_hypercall(H_REMOVE, h_remove);
|
spapr_register_hypercall(H_REMOVE, h_remove);
|
||||||
spapr_register_hypercall(H_PROTECT, h_protect);
|
spapr_register_hypercall(H_PROTECT, h_protect);
|
||||||
|
spapr_register_hypercall(H_READ, h_read);
|
||||||
|
|
||||||
/* hcall-bulk */
|
/* hcall-bulk */
|
||||||
spapr_register_hypercall(H_BULK_REMOVE, h_bulk_remove);
|
spapr_register_hypercall(H_BULK_REMOVE, h_bulk_remove);
|
||||||
|
Loading…
Reference in New Issue
Block a user