diff options
author | Alexander Graf <agraf@suse.de> | 2010-02-19 05:00:42 -0500 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2010-04-25 05:35:21 -0400 |
commit | 0564ee8a8611326f28bae2a0455182b458826762 (patch) | |
tree | cef03027a7595370c0ca9bbd13e5446186aa39a1 /arch/powerpc/include/asm | |
parent | dba2e123e7502870c965e4b445554bc8e56f78b2 (diff) |
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>
Diffstat (limited to 'arch/powerpc/include/asm')
-rw-r--r-- | arch/powerpc/include/asm/kvm_ppc.h | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h index 07612189eb8b..c7fcdd751f14 100644 --- a/arch/powerpc/include/asm/kvm_ppc.h +++ b/arch/powerpc/include/asm/kvm_ppc.h | |||
@@ -103,6 +103,39 @@ extern void kvmppc_booke_exit(void); | |||
103 | 103 | ||
104 | extern void kvmppc_core_destroy_mmu(struct kvm_vcpu *vcpu); | 104 | extern void kvmppc_core_destroy_mmu(struct kvm_vcpu *vcpu); |
105 | 105 | ||
106 | /* | ||
107 | * Cuts out inst bits with ordering according to spec. | ||
108 | * That means the leftmost bit is zero. All given bits are included. | ||
109 | */ | ||
110 | static inline u32 kvmppc_get_field(u64 inst, int msb, int lsb) | ||
111 | { | ||
112 | u32 r; | ||
113 | u32 mask; | ||
114 | |||
115 | BUG_ON(msb > lsb); | ||
116 | |||
117 | mask = (1 << (lsb - msb + 1)) - 1; | ||
118 | r = (inst >> (63 - lsb)) & mask; | ||
119 | |||
120 | return r; | ||
121 | } | ||
122 | |||
123 | /* | ||
124 | * Replaces inst bits with ordering according to spec. | ||
125 | */ | ||
126 | static inline u32 kvmppc_set_field(u64 inst, int msb, int lsb, int value) | ||
127 | { | ||
128 | u32 r; | ||
129 | u32 mask; | ||
130 | |||
131 | BUG_ON(msb > lsb); | ||
132 | |||
133 | mask = ((1 << (lsb - msb + 1)) - 1) << (63 - lsb); | ||
134 | r = (inst & ~mask) | ((value << (63 - lsb)) & mask); | ||
135 | |||
136 | return r; | ||
137 | } | ||
138 | |||
106 | #ifdef CONFIG_PPC_BOOK3S | 139 | #ifdef CONFIG_PPC_BOOK3S |
107 | 140 | ||
108 | /* We assume we're always acting on the current vcpu */ | 141 | /* We assume we're always acting on the current vcpu */ |