a little disassembly infrastructure
Subsystems (2)
RFC 1/1 a little disassembly infrastructure
Hi, I wrote this patch for KVM [1], but now that I look closer it seems like there might be some overlapping functionality.
First there's emulate_instruction(), but since that only handles a few instructions it's just an ordered list of if ((instruction & MASK_A) == INST_A) tests, so it doesn't actually parse out opcodes or anything.
I've also found xmon's ppc-opc.c. That parses the opcode and operands, so could use some shared macros. Of course, the actual lookup isn't time-sensitive, so that doesn't make sense to share. On the other hand, if we do come up with something fast *and* robust for KVM, maybe xmon could use that.
Of course, these macros alone is pretty small, so maybe it's not a big deal to make a kvm-specific copy of them, leaving the other uses alone.
Comments?
[1] KVM on PowerPC traps when privileged instructions are executed in the guest context. We must then (quickly!) disassemble them and emulate their behavior. Right now we do this with a giant switch statement or two, but are considering more sophisticated techniques in the future.
Signature · 2 lines
Hollis Blanchard IBM Linux Technology Center
ppc: Create disassemble.h to extract instruction fields
This is used in a couple places in KVM, but isn't KVM-specific.
arch/powerpc/include/asm/disassemble.h new file +80 -0
@@ -0,0 +1,80 @@ +/* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License, version 2, as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* Copyright IBM Corp. 2008 +* +* Authors: Hollis Blanchard <[email protected]> +*/ + +#ifndef __ASM_PPC_DISASSEMBLE_H__ +#define __ASM_PPC_DISASSEMBLE_H__ + +#include <linux/types.h> + +static inline unsigned int get_op (u32 inst) +{ +return inst >>26 ; +} + +static inline unsigned int get_xop (u32 inst) +{ +return (inst >>1 ) &0x3ff ; +} + +static inline unsigned int get_sprn (u32 inst) +{ +return ((inst >>16 ) &0x1f ) | ((inst >>6 ) &0x3e0 ); +} + +static inline unsigned int get_dcrn (u32 inst) +{ +return ((inst >>16 ) &0x1f ) | ((inst >>6 ) &0x3e0 ); +} + +static inline unsigned int get_rt (u32 inst) +{ +return (inst >>21 ) &0x1f ; +} + +static inline unsigned int get_rs (u32 inst) +{ +return (inst >>21 ) &0x1f ; +} + +static inline unsigned int get_ra (u32 inst) +{ +return (inst >>16 ) &0x1f ; +} + +static inline unsigned int get_rb (u32 inst) +{ +return (inst >>11 ) &0x1f ; +} + +static inline unsigned int get_rc (u32 inst) +{ +return inst &0x1 ; +} + +static inline unsigned int get_ws (u32 inst) +{ +return (inst >>11 ) &0x1f ; +} + +static inline unsigned int get_d (u32 inst) +{ +return inst &0xffff ; +} + +#endif /* __ASM_PPC_DISASSEMBLE_H__ */
arch/powerpc/kvm/emulate.c +1 -56
63 lines not on this page · raw message
Quoted 16 lines · Hollis Blanchard
Hi, I wrote this patch for KVM [1], but now that I look closer it seems like there might be some overlapping functionality.
First there's
emulate_instruction(), but since that only handles a few instructions it's just an ordered list of if ((instruction &MASK_A) =INST_A) tests, so it doesn't actually parse out opcodes or anything.I've also found xmon's
ppc-opc.c. That parses the opcode and operands, so could use some shared macros. Of course, the actual lookup isn't time-sensitive, so that doesn't make sense to share. On the other hand, if we do come up with something fast *and* robust for KVM, maybe xmon could use that.Of course, these macros alone is pretty small, so maybe it's not a big deal to make a kvm-specific copy of them, leaving the other uses alone.
Quoted 7 lines
Comments?
[1] KVM on PowerPC traps when privileged instructions are executed in the guest context. We must then (quickly!) disassemble them and emulate their behavior. Right now we do this with a giant switch statement or two, but are considering more sophisticated techniques in the future.
Yeah, personally I like this change. I was looking at emulating some PPC instructions in a driver and based on inspection I was going to use the code you had in for KVM. Having these macros in a generic header is a "Good Thing" IMHO. I think we should have a generic disassembly infrastructure and use that everywhere.
Quoted 2 lines · Hollis Blanchard
I've also found xmon's
ppc-opc.c. That parses the opcode and operands, so could use some shared macros.
That's a direct copy from GNU binutils. I'm reluctant to modify it because then maintenance becomes more than just copying in the latest version.
Paul.
Quoted 8 lines · Paul Mackerras
Quoted 2 lines · Hollis Blanchard
I've also found xmon's
ppc-opc.c. That parses the opcode and operands, so could use some shared macros.That's a direct copy from GNU binutils. I'm reluctant to modify it because then maintenance becomes more than just copying in the latest version.
OK, makes sense.
Can I get an Acked-by on this patch, or should I move the code to a KVM-specific header? Either way I'll submit it via the KVM tree as usual.
Signature · 2 lines
Hollis Blanchard IBM Linux Technology Center
Quoted 10 lines · Hollis Blanchard
Quoted 8 lines · Paul Mackerras
Quoted 2 lines · Hollis Blanchard
I've also found xmon's
ppc-opc.c. That parses the opcode and operands, so could use some shared macros.That's a direct copy from GNU binutils. I'm reluctant to modify it because then maintenance becomes more than just copying in the latest version.
Quoted 5 lines
OK, makes sense.
Can I get an Acked-by on this patch, or should I move the code to a KVM-specific header? Either way I'll submit it via the KVM tree as usual.
Paul, is this OK? I'm waiting for your ack before sending a number of dependent KVM patches to Avi.
ppc: Create disassemble.h to extract instruction fields
This is used in a couple places in KVM, but isn't KVM-specific.
However, xmon uses a direct copy of ppc_opc.c from binutils, so xmon won't use this. emulate_instruction() doesn't need it either, because it can use a series of mask tests.
arch/powerpc/include/asm/disassemble.h new file +80 -0
@@ -0,0 +1,80 @@ +/* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License, version 2, as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* Copyright IBM Corp. 2008 +* +* Authors: Hollis Blanchard <[email protected]> +*/ + +#ifndef __ASM_PPC_DISASSEMBLE_H__ +#define __ASM_PPC_DISASSEMBLE_H__ + +#include <linux/types.h> + +static inline unsigned int get_op (u32 inst) +{ +return inst >>26 ; +} + +static inline unsigned int get_xop (u32 inst) +{ +return (inst >>1 ) &0x3ff ; +} + +static inline unsigned int get_sprn (u32 inst) +{ +return ((inst >>16 ) &0x1f ) | ((inst >>6 ) &0x3e0 ); +} + +static inline unsigned int get_dcrn (u32 inst) +{ +return ((inst >>16 ) &0x1f ) | ((inst >>6 ) &0x3e0 ); +} + +static inline unsigned int get_rt (u32 inst) +{ +return (inst >>21 ) &0x1f ; +} + +static inline unsigned int get_rs (u32 inst) +{ +return (inst >>21 ) &0x1f ; +} + +static inline unsigned int get_ra (u32 inst) +{ +return (inst >>16 ) &0x1f ; +} + +static inline unsigned int get_rb (u32 inst) +{ +return (inst >>11 ) &0x1f ; +} + +static inline unsigned int get_rc (u32 inst) +{ +return inst &0x1 ; +} + +static inline unsigned int get_ws (u32 inst) +{ +return (inst >>11 ) &0x1f ; +} + +static inline unsigned int get_d (u32 inst) +{ +return inst &0xffff ; +} + +#endif /* __ASM_PPC_DISASSEMBLE_H__ */
arch/powerpc/kvm/emulate.c +1 -56
63 lines not on this page · raw message
Signature · 2 lines
Hollis Blanchard IBM Linux Technology Center
Quoted 2 lines · Hollis Blanchard
Hi, I wrote this patch for KVM [1], but now that I look closer it seems like there might be some overlapping functionality.
Looks OK -
subject to you writing a suitable patch description. :)
Paul.