X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fi386%2Fmath-emu%2Ffpu_entry.c;h=a0f1cab20cecd82af9243ec0e33b5f7d27add1fb;hb=refs%2Fheads%2Fvserver;hp=633f954c34501c5771807c596ce8b0ba34ba9baf;hpb=9bf4aaab3e101692164d49b7ca357651eb691cb6;p=linux-2.6.git diff --git a/arch/i386/math-emu/fpu_entry.c b/arch/i386/math-emu/fpu_entry.c index 633f954c3..a0f1cab20 100644 --- a/arch/i386/math-emu/fpu_entry.c +++ b/arch/i386/math-emu/fpu_entry.c @@ -25,7 +25,6 @@ +---------------------------------------------------------------------------*/ #include -#include #include #include @@ -155,10 +154,10 @@ asmlinkage void math_emulate(long arg) RE_ENTRANT_CHECK_ON; #endif /* RE_ENTRANT_CHECKING */ - if (!current->used_math) + if (!used_math()) { finit(); - current->used_math = 1; + set_used_math(); } SETUP_DATA_AREA(arg); @@ -211,9 +210,8 @@ asmlinkage void math_emulate(long arg) if ( code_limit < code_base ) code_limit = 0xffffffff; } - FPU_lookahead = 1; - if (current->ptrace & PT_PTRACED) - FPU_lookahead = 0; + /* Don't run ahead if single-stepping. */ + FPU_lookahead = (FPU_EFLAGS & X86_EFLAGS_TF) == 0; if ( !valid_prefix(&byte1, (u_char __user **)&FPU_EIP, &addr_modes.override) ) @@ -257,7 +255,7 @@ do_another_FPU_instruction: } RE_ENTRANT_CHECK_OFF; - FPU_code_verify_area(1); + FPU_code_access_ok(1); FPU_get_user(FPU_modrm, (u_char __user *) FPU_EIP); RE_ENTRANT_CHECK_ON; FPU_EIP++; @@ -589,7 +587,7 @@ static int valid_prefix(u_char *Byte, u_char __user **fpu_eip, *override = (overrides) { 0, 0, PREFIX_DEFAULT }; /* defaults */ RE_ENTRANT_CHECK_OFF; - FPU_code_verify_area(1); + FPU_code_access_ok(1); FPU_get_user(byte, ip); RE_ENTRANT_CHECK_ON; @@ -635,7 +633,7 @@ static int valid_prefix(u_char *Byte, u_char __user **fpu_eip, do_next_byte: ip++; RE_ENTRANT_CHECK_OFF; - FPU_code_verify_area(1); + FPU_code_access_ok(1); FPU_get_user(byte, ip); RE_ENTRANT_CHECK_ON; break; @@ -686,7 +684,7 @@ int restore_i387_soft(void *s387, struct _fpstate __user *buf) int offset, other, i, tags, regnr, tag, newtop; RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_READ, d, 7*4 + 8*10); + FPU_access_ok(VERIFY_READ, d, 7*4 + 8*10); if (__copy_from_user(&S387->cwd, d, 7*4)) return -1; RE_ENTRANT_CHECK_ON; @@ -732,7 +730,7 @@ int save_i387_soft(void *s387, struct _fpstate __user * buf) int offset = (S387->ftop & 7) * 10, other = 80 - offset; RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_WRITE, d, 7*4 + 8*10); + FPU_access_ok(VERIFY_WRITE, d, 7*4 + 8*10); #ifdef PECULIAR_486 S387->cwd &= ~0xe080; /* An 80486 sets nearly all of the reserved bits to 1. */ @@ -742,7 +740,8 @@ int save_i387_soft(void *s387, struct _fpstate __user * buf) S387->fcs &= ~0xf8000000; S387->fos |= 0xffff0000; #endif /* PECULIAR_486 */ - __copy_to_user(d, &S387->cwd, 7*4); + if (__copy_to_user(d, &S387->cwd, 7*4)) + return -1; RE_ENTRANT_CHECK_ON; d += 7*4;