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);
|
||||
|
||||
/*
|
||||
* 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
|
||||
|
||||
/* We assume we're always acting on the current vcpu */
|
||||
|
|
Loading…
Reference in New Issue