ia64/xen-unstable
changeset 3426:983a02b6959a
bitkeeper revision 1.1159.170.91 (41e53b7eEag3oyhnsSlzeQJHgcNl0A)
Yet another seg-fixup fix. I was wrong about opcodes A0 and A2. :-(
Yet another seg-fixup fix. I was wrong about opcodes A0 and A2. :-(
author | kaf24@scramble.cl.cam.ac.uk |
---|---|
date | Wed Jan 12 15:00:14 2005 +0000 (2005-01-12) |
parents | 91b80105fc04 |
children | 7a4e8660d4f4 e936974c5b7e |
files | xen/arch/x86/x86_32/seg_fixup.c |
line diff
1.1 --- a/xen/arch/x86/x86_32/seg_fixup.c Wed Jan 12 14:17:52 2005 +0000 1.2 +++ b/xen/arch/x86/x86_32/seg_fixup.c Wed Jan 12 15:00:14 2005 +0000 1.3 @@ -75,7 +75,7 @@ static unsigned char insn_decode[256] = 1.4 X, X, X, X, X, X, X, X, 1.5 X, X, X, X, X, X, X, X, 1.6 /* 0xA0 - 0xAF */ 1.7 - O|1, O|4, O|1, O|4, X, X, X, X, 1.8 + O|4, O|4, O|4, O|4, X, X, X, X, 1.9 X, X, X, X, X, X, X, X, 1.10 /* 0xB0 - 0xBF */ 1.11 X, X, X, X, X, X, X, X, 1.12 @@ -366,28 +366,17 @@ int gpf_emulate_4gb(struct xen_regs *reg 1.13 1.14 if ( !(decode & HAS_MODRM) ) 1.15 { 1.16 - switch ( decode & 7 ) 1.17 + if ( (decode & 7) != 4 ) 1.18 + goto fail; 1.19 + 1.20 + if ( get_user(offset, (u32 *)pb) ) 1.21 { 1.22 - case 1: 1.23 - if ( get_user(b, pb) ) 1.24 - { 1.25 - DPRINTK("Fault while extracting <moffs8>.\n"); 1.26 - goto page_fault; 1.27 - } 1.28 - pb++; 1.29 - offset = (signed long)(signed char)b; 1.30 - goto skip_modrm; 1.31 - case 4: 1.32 - if ( get_user(offset, (u32 *)pb) ) 1.33 - { 1.34 - DPRINTK("Fault while extracting <disp8>.\n"); 1.35 - goto page_fault; 1.36 - } 1.37 - pb += 4; 1.38 - goto skip_modrm; 1.39 - default: 1.40 - goto fail; 1.41 + DPRINTK("Fault while extracting <disp8>.\n"); 1.42 + goto page_fault; 1.43 } 1.44 + pb += 4; 1.45 + 1.46 + goto skip_modrm; 1.47 } 1.48 1.49 /*