X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fi386%2Fmath-emu%2Freg_ld_str.c;h=e976caef64982849f3caa918ec5181bb3958b237;hb=refs%2Fremotes%2Fvserver;hp=699fe331c6d37f31d48b2f79a038483b048678a7;hpb=9bf4aaab3e101692164d49b7ca357651eb691cb6;p=linux-2.6.git diff --git a/arch/i386/math-emu/reg_ld_str.c b/arch/i386/math-emu/reg_ld_str.c index 699fe331c..e976caef6 100644 --- a/arch/i386/math-emu/reg_ld_str.c +++ b/arch/i386/math-emu/reg_ld_str.c @@ -91,7 +91,7 @@ int FPU_load_extended(long double __user *s, int stnr) FPU_REG *sti_ptr = &st(stnr); RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_READ, s, 10); + FPU_access_ok(VERIFY_READ, s, 10); __copy_from_user(sti_ptr, s, 10); RE_ENTRANT_CHECK_ON; @@ -106,7 +106,7 @@ int FPU_load_double(double __user *dfloat, FPU_REG *loaded_data) unsigned m64, l64; RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_READ, dfloat, 8); + FPU_access_ok(VERIFY_READ, dfloat, 8); FPU_get_user(m64, 1 + (unsigned long __user *) dfloat); FPU_get_user(l64, (unsigned long __user *) dfloat); RE_ENTRANT_CHECK_ON; @@ -178,7 +178,7 @@ int FPU_load_single(float __user *single, FPU_REG *loaded_data) int exp, tag, negative; RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_READ, single, 4); + FPU_access_ok(VERIFY_READ, single, 4); FPU_get_user(m32, (unsigned long __user *) single); RE_ENTRANT_CHECK_ON; @@ -243,8 +243,9 @@ int FPU_load_int64(long long __user *_s) FPU_REG *st0_ptr = &st(0); RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_READ, _s, 8); - copy_from_user(&s,_s,8); + FPU_access_ok(VERIFY_READ, _s, 8); + if (copy_from_user(&s,_s,8)) + FPU_abort; RE_ENTRANT_CHECK_ON; if (s == 0) @@ -274,7 +275,7 @@ int FPU_load_int32(long __user *_s, FPU_REG *loaded_data) int negative; RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_READ, _s, 4); + FPU_access_ok(VERIFY_READ, _s, 4); FPU_get_user(s, _s); RE_ENTRANT_CHECK_ON; @@ -302,7 +303,7 @@ int FPU_load_int16(short __user *_s, FPU_REG *loaded_data) int s, negative; RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_READ, _s, 2); + FPU_access_ok(VERIFY_READ, _s, 2); /* Cast as short to get the sign extended. */ FPU_get_user(s, _s); RE_ENTRANT_CHECK_ON; @@ -335,7 +336,7 @@ int FPU_load_bcd(u_char __user *s) int sign; RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_READ, s, 10); + FPU_access_ok(VERIFY_READ, s, 10); RE_ENTRANT_CHECK_ON; for ( pos = 8; pos >= 0; pos--) { @@ -380,7 +381,7 @@ int FPU_store_extended(FPU_REG *st0_ptr, u_char st0_tag, long double __user *d) if ( st0_tag != TAG_Empty ) { RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_WRITE, d, 10); + FPU_access_ok(VERIFY_WRITE, d, 10); FPU_put_user(st0_ptr->sigl, (unsigned long __user *) d); FPU_put_user(st0_ptr->sigh, (unsigned long __user *) ((u_char __user *)d + 4)); @@ -397,7 +398,7 @@ int FPU_store_extended(FPU_REG *st0_ptr, u_char st0_tag, long double __user *d) /* The masked response */ /* Put out the QNaN indefinite */ RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_WRITE,d,10); + FPU_access_ok(VERIFY_WRITE,d,10); FPU_put_user(0, (unsigned long __user *) d); FPU_put_user(0xc0000000, 1 + (unsigned long __user *) d); FPU_put_user(0xffff, 4 + (short __user *) d); @@ -607,7 +608,7 @@ int FPU_store_double(FPU_REG *st0_ptr, u_char st0_tag, double __user *dfloat) /* The masked response */ /* Put out the QNaN indefinite */ RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_WRITE,dfloat,8); + FPU_access_ok(VERIFY_WRITE,dfloat,8); FPU_put_user(0, (unsigned long __user *) dfloat); FPU_put_user(0xfff80000, 1 + (unsigned long __user *) dfloat); RE_ENTRANT_CHECK_ON; @@ -620,7 +621,7 @@ int FPU_store_double(FPU_REG *st0_ptr, u_char st0_tag, double __user *dfloat) l[1] |= 0x80000000; RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_WRITE,dfloat,8); + FPU_access_ok(VERIFY_WRITE,dfloat,8); FPU_put_user(l[0], (unsigned long __user *)dfloat); FPU_put_user(l[1], 1 + (unsigned long __user *)dfloat); RE_ENTRANT_CHECK_ON; @@ -826,7 +827,7 @@ int FPU_store_single(FPU_REG *st0_ptr, u_char st0_tag, float __user *single) /* The masked response */ /* Put out the QNaN indefinite */ RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_WRITE,single,4); + FPU_access_ok(VERIFY_WRITE,single,4); FPU_put_user(0xffc00000, (unsigned long __user *) single); RE_ENTRANT_CHECK_ON; return 1; @@ -845,7 +846,7 @@ int FPU_store_single(FPU_REG *st0_ptr, u_char st0_tag, float __user *single) templ |= 0x80000000; RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_WRITE,single,4); + FPU_access_ok(VERIFY_WRITE,single,4); FPU_put_user(templ,(unsigned long __user *) single); RE_ENTRANT_CHECK_ON; @@ -906,8 +907,9 @@ int FPU_store_int64(FPU_REG *st0_ptr, u_char st0_tag, long long __user *d) } RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_WRITE,d,8); - copy_to_user(d, &tll, 8); + FPU_access_ok(VERIFY_WRITE,d,8); + if (copy_to_user(d, &tll, 8)) + FPU_abort; RE_ENTRANT_CHECK_ON; return 1; @@ -963,7 +965,7 @@ int FPU_store_int32(FPU_REG *st0_ptr, u_char st0_tag, long __user *d) } RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_WRITE,d,4); + FPU_access_ok(VERIFY_WRITE,d,4); FPU_put_user(t.sigl, (unsigned long __user *) d); RE_ENTRANT_CHECK_ON; @@ -1020,7 +1022,7 @@ int FPU_store_int16(FPU_REG *st0_ptr, u_char st0_tag, short __user *d) } RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_WRITE,d,2); + FPU_access_ok(VERIFY_WRITE,d,2); FPU_put_user((short)t.sigl, d); RE_ENTRANT_CHECK_ON; @@ -1069,7 +1071,7 @@ int FPU_store_bcd(FPU_REG *st0_ptr, u_char st0_tag, u_char __user *d) { /* Produce the QNaN "indefinite" */ RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_WRITE,d,10); + FPU_access_ok(VERIFY_WRITE,d,10); for ( i = 0; i < 7; i++) FPU_put_user(0, d+i); /* These bytes "undefined" */ FPU_put_user(0xc0, d+7); /* This byte "undefined" */ @@ -1088,7 +1090,7 @@ int FPU_store_bcd(FPU_REG *st0_ptr, u_char st0_tag, u_char __user *d) } RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_WRITE,d,10); + FPU_access_ok(VERIFY_WRITE,d,10); RE_ENTRANT_CHECK_ON; for ( i = 0; i < 9; i++) { @@ -1186,7 +1188,7 @@ u_char __user *fldenv(fpu_addr_modes addr_modes, u_char __user *s) ^ (addr_modes.override.operand_size == OP_SIZE_PREFIX)) ) { RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_READ, s, 0x0e); + FPU_access_ok(VERIFY_READ, s, 0x0e); FPU_get_user(control_word, (unsigned short __user *) s); FPU_get_user(partial_status, (unsigned short __user *) (s+2)); FPU_get_user(tag_word, (unsigned short __user *) (s+4)); @@ -1206,7 +1208,7 @@ u_char __user *fldenv(fpu_addr_modes addr_modes, u_char __user *s) else { RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_READ, s, 0x1c); + FPU_access_ok(VERIFY_READ, s, 0x1c); FPU_get_user(control_word, (unsigned short __user *) s); FPU_get_user(partial_status, (unsigned short __user *) (s+4)); FPU_get_user(tag_word, (unsigned short __user *) (s+8)); @@ -1274,7 +1276,7 @@ void frstor(fpu_addr_modes addr_modes, u_char __user *data_address) /* Copy all registers in stack order. */ RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_READ,s,80); + FPU_access_ok(VERIFY_READ,s,80); __copy_from_user(register_base+offset, s, other); if ( offset ) __copy_from_user(register_base, s+other, offset); @@ -1298,7 +1300,7 @@ u_char __user *fstenv(fpu_addr_modes addr_modes, u_char __user *d) ^ (addr_modes.override.operand_size == OP_SIZE_PREFIX)) ) { RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_WRITE,d,14); + FPU_access_ok(VERIFY_WRITE,d,14); #ifdef PECULIAR_486 FPU_put_user(control_word & ~0xe080, (unsigned long __user *) d); #else @@ -1326,7 +1328,7 @@ u_char __user *fstenv(fpu_addr_modes addr_modes, u_char __user *d) else { RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_WRITE, d, 7*4); + FPU_access_ok(VERIFY_WRITE, d, 7*4); #ifdef PECULIAR_486 control_word &= ~0xe080; /* An 80486 sets nearly all of the reserved bits to 1. */ @@ -1336,7 +1338,8 @@ u_char __user *fstenv(fpu_addr_modes addr_modes, u_char __user *d) I387.soft.fcs &= ~0xf8000000; I387.soft.fos |= 0xffff0000; #endif /* PECULIAR_486 */ - __copy_to_user(d, &control_word, 7*4); + if (__copy_to_user(d, &control_word, 7*4)) + FPU_abort; RE_ENTRANT_CHECK_ON; d += 0x1c; } @@ -1356,12 +1359,14 @@ void fsave(fpu_addr_modes addr_modes, u_char __user *data_address) d = fstenv(addr_modes, data_address); RE_ENTRANT_CHECK_OFF; - FPU_verify_area(VERIFY_WRITE,d,80); + FPU_access_ok(VERIFY_WRITE,d,80); /* Copy all registers in stack order. */ - __copy_to_user(d, register_base+offset, other); + if (__copy_to_user(d, register_base+offset, other)) + FPU_abort; if ( offset ) - __copy_to_user(d+other, register_base, offset); + if (__copy_to_user(d+other, register_base, offset)) + FPU_abort; RE_ENTRANT_CHECK_ON; finit();