Leendert,
The byte size is handled in set_reg_value(), but not in __set_reg_value(), and
it's true that there is a bug in set_reg_value().
I've send a patch for this bug:
diff -r c8e840ac3019 xen/arch/x86/vmx_io.c
--- a/xen/arch/x86/vmx_io.c Tue Sep 6 10:11:20 2005
+++ b/xen/arch/x86/vmx_io.c Fri Sep 9 22:28:25 2005
@@ -261,7 +261,7 @@
domain_crash_synchronous();
break;
}
-
+ return ;
}
switch (index) {
leendert@xxxxxxxxxxxxxx scribbled on 2005年9月10日 21:36:
> An FC4/i386 install inside VMX on an x86_64 system fails because byte
> size is not handled by __set_reg_value. This patch adds that support.
>
> This patch also reindents Chengyuan Li cmpb patch so that is aligns
> with the rest of the code in that block.
>
> Signed-Off-By: Leendert van Doorn <leendert@xxxxxxxxxxxxxx>
>
> diff -r 3f2751c6e721 xen/arch/x86/vmx_io.c
> --- a/xen/arch/x86/vmx_io.c Sat Sep 10 14:44:31 2005
> +++ b/xen/arch/x86/vmx_io.c Sat Sep 10 14:23:12 2005
> @@ -99,7 +99,6 @@
> printk("Error: size:%x, index:%x are invalid!\n", size,
> index); domain_crash_synchronous();
> break;
> -
> }
> break;
> case WORD:
> @@ -199,6 +198,7 @@
> static inline void __set_reg_value(unsigned long *reg, int size,
> long value) {
> switch (size) {
> + case BYTE:
> case BYTE_64:
> *reg &= ~0xFF;
> *reg |= (value & 0xFF);
> @@ -215,7 +215,7 @@
> *reg = value;
> break;
> default:
> - printk("Error: <__set_reg_value> : Unknown size for
> register\n"); + printk("Error: <__set_reg_value>: size:%x is
> invalid\n", size); domain_crash_synchronous();
> }
> }
> diff -r 3f2751c6e721 xen/arch/x86/vmx_platform.c
> --- a/xen/arch/x86/vmx_platform.c Sat Sep 10 14:44:31 2005
> +++ b/xen/arch/x86/vmx_platform.c Sat Sep 10 14:23:12 2005
> @@ -55,6 +55,7 @@
> static inline long __get_reg_value(unsigned long reg, int size)
> {
> switch(size) {
> + case BYTE:
> case BYTE_64:
> return (char)(reg & 0xFF);
> case WORD:
> @@ -430,10 +431,10 @@
> if (((opcode[1] >> 3) & 7) == 7) { /* cmp $imm, m32/16 */
> instr->instr = INSTR_CMP;
>
> - if (opcode[0] == 0x80)
> - GET_OP_SIZE_FOR_BYTE(instr->op_size);
> - else
> - GET_OP_SIZE_FOR_NONEBYTE(instr->op_size);
> + if (opcode[0] == 0x80)
> + GET_OP_SIZE_FOR_BYTE(instr->op_size);
> + else
> + GET_OP_SIZE_FOR_NONEBYTE(instr->op_size);
>
> instr->operand[0] = mk_operand(instr->op_size, 0, 0, IMMEDIATE);
> instr->immediate = get_immediate(vm86, opcode+1, BYTE);
Thanks,
Chengyuan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|