KVM: PPC: Add helpers to modify ppc fields
The PowerPC specification always lists bits from MSB to LSB. That is really confusing when you're trying to write C code, because it fits in pretty badly with the normal (1 << xx) schemes. So I came up with some nice wrappers that allow to get and set fields in a u64 with bit numbers exactly as given in the spec. That makes the code in KVM and the spec easier comparable. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
dba2e123e7
commit
0564ee8a86
|
@ -103,6 +103,39 @@ extern void kvmppc_booke_exit(void);
|
||||||
|
|
||||||
extern void kvmppc_core_destroy_mmu(struct kvm_vcpu *vcpu);
|
extern void kvmppc_core_destroy_mmu(struct kvm_vcpu *vcpu);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Cuts out inst bits with ordering according to spec.
|
||||||
|
* That means the leftmost bit is zero. All given bits are included.
|
||||||
|
*/
|
||||||
|
static inline u32 kvmppc_get_field(u64 inst, int msb, int lsb)
|
||||||
|
{
|
||||||
|
u32 r;
|
||||||
|
u32 mask;
|
||||||
|
|
||||||
|
BUG_ON(msb > lsb);
|
||||||
|
|
||||||
|
mask = (1 << (lsb - msb + 1)) - 1;
|
||||||
|
r = (inst >> (63 - lsb)) & mask;
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Replaces inst bits with ordering according to spec.
|
||||||
|
*/
|
||||||
|
static inline u32 kvmppc_set_field(u64 inst, int msb, int lsb, int value)
|
||||||
|
{
|
||||||
|
u32 r;
|
||||||
|
u32 mask;
|
||||||
|
|
||||||
|
BUG_ON(msb > lsb);
|
||||||
|
|
||||||
|
mask = ((1 << (lsb - msb + 1)) - 1) << (63 - lsb);
|
||||||
|
r = (inst & ~mask) | ((value << (63 - lsb)) & mask);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_BOOK3S
|
#ifdef CONFIG_PPC_BOOK3S
|
||||||
|
|
||||||
/* We assume we're always acting on the current vcpu */
|
/* We assume we're always acting on the current vcpu */
|
||||||
|
|
Loading…
Reference in New Issue