X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fi386%2Fmath-emu%2Fget_address.c;h=9819b705efa422af8c3f1ee5652fa0649f606811;hb=43bc926fffd92024b46cafaf7350d669ba9ca884;hp=dd568ade950a015d19e9210d4cfeccb3ee6ed714;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/arch/i386/math-emu/get_address.c b/arch/i386/math-emu/get_address.c index dd568ade9..9819b705e 100644 --- a/arch/i386/math-emu/get_address.c +++ b/arch/i386/math-emu/get_address.c @@ -81,8 +81,8 @@ static int sib(int mod, unsigned long *fpu_eip) long offset; RE_ENTRANT_CHECK_OFF; - FPU_code_verify_area(1); - FPU_get_user(base, (u_char *) (*fpu_eip)); /* The SIB byte */ + FPU_code_access_ok(1); + FPU_get_user(base, (u_char __user *) (*fpu_eip)); /* The SIB byte */ RE_ENTRANT_CHECK_ON; (*fpu_eip)++; ss = base >> 6; @@ -111,8 +111,8 @@ static int sib(int mod, unsigned long *fpu_eip) /* 8 bit signed displacement */ long displacement; RE_ENTRANT_CHECK_OFF; - FPU_code_verify_area(1); - FPU_get_user(displacement, (signed char *) (*fpu_eip)); + FPU_code_access_ok(1); + FPU_get_user(displacement, (signed char __user *) (*fpu_eip)); offset += displacement; RE_ENTRANT_CHECK_ON; (*fpu_eip)++; @@ -122,8 +122,8 @@ static int sib(int mod, unsigned long *fpu_eip) /* 32 bit displacement */ long displacement; RE_ENTRANT_CHECK_OFF; - FPU_code_verify_area(4); - FPU_get_user(displacement, (long *) (*fpu_eip)); + FPU_code_access_ok(4); + FPU_get_user(displacement, (long __user *) (*fpu_eip)); offset += displacement; RE_ENTRANT_CHECK_ON; (*fpu_eip) += 4; @@ -155,7 +155,6 @@ static long pm_address(u_char FPU_modrm, u_char segment, { struct desc_struct descriptor; unsigned long base_address, limit, address, seg_top; - unsigned short selector; segment--; @@ -173,17 +172,11 @@ static long pm_address(u_char FPU_modrm, u_char segment, /* fs and gs aren't used by the kernel, so they still have their user-space values. */ case PREFIX_FS_-1: - /* The cast is needed here to get gcc 2.8.0 to use a 16 bit register - in the assembler statement. */ - - __asm__("mov %%fs,%0":"=r" (selector)); - addr->selector = selector; + /* N.B. - movl %seg, mem is a 2 byte write regardless of prefix */ + savesegment(fs, addr->selector); break; case PREFIX_GS_-1: - /* The cast is needed here to get gcc 2.8.0 to use a 16 bit register - in the assembler statement. */ - __asm__("mov %%gs,%0":"=r" (selector)); - addr->selector = selector; + savesegment(gs, addr->selector); break; default: addr->selector = PM_REG_(segment); @@ -241,7 +234,7 @@ static long pm_address(u_char FPU_modrm, u_char segment, */ -void *FPU_get_address(u_char FPU_modrm, unsigned long *fpu_eip, +void __user *FPU_get_address(u_char FPU_modrm, unsigned long *fpu_eip, struct address *addr, fpu_addr_modes addr_modes) { @@ -276,33 +269,33 @@ void *FPU_get_address(u_char FPU_modrm, unsigned long *fpu_eip, { /* Special case: disp32 */ RE_ENTRANT_CHECK_OFF; - FPU_code_verify_area(4); - FPU_get_user(address, (unsigned long *) (*fpu_eip)); + FPU_code_access_ok(4); + FPU_get_user(address, (unsigned long __user *) (*fpu_eip)); (*fpu_eip) += 4; RE_ENTRANT_CHECK_ON; addr->offset = address; - return (void *) address; + return (void __user *) address; } else { address = *cpu_reg_ptr; /* Just return the contents of the cpu register */ addr->offset = address; - return (void *) address; + return (void __user *) address; } case 1: /* 8 bit signed displacement */ RE_ENTRANT_CHECK_OFF; - FPU_code_verify_area(1); - FPU_get_user(address, (signed char *) (*fpu_eip)); + FPU_code_access_ok(1); + FPU_get_user(address, (signed char __user *) (*fpu_eip)); RE_ENTRANT_CHECK_ON; (*fpu_eip)++; break; case 2: /* 32 bit displacement */ RE_ENTRANT_CHECK_OFF; - FPU_code_verify_area(4); - FPU_get_user(address, (long *) (*fpu_eip)); + FPU_code_access_ok(4); + FPU_get_user(address, (long __user *) (*fpu_eip)); (*fpu_eip) += 4; RE_ENTRANT_CHECK_ON; break; @@ -331,11 +324,11 @@ void *FPU_get_address(u_char FPU_modrm, unsigned long *fpu_eip, EXCEPTION(EX_INTERNAL|0x133); } - return (void *)address; + return (void __user *)address; } -void *FPU_get_address_16(u_char FPU_modrm, unsigned long *fpu_eip, +void __user *FPU_get_address_16(u_char FPU_modrm, unsigned long *fpu_eip, struct address *addr, fpu_addr_modes addr_modes) { @@ -362,8 +355,8 @@ void *FPU_get_address_16(u_char FPU_modrm, unsigned long *fpu_eip, { /* Special case: disp16 */ RE_ENTRANT_CHECK_OFF; - FPU_code_verify_area(2); - FPU_get_user(address, (unsigned short *) (*fpu_eip)); + FPU_code_access_ok(2); + FPU_get_user(address, (unsigned short __user *) (*fpu_eip)); (*fpu_eip) += 2; RE_ENTRANT_CHECK_ON; goto add_segment; @@ -372,16 +365,16 @@ void *FPU_get_address_16(u_char FPU_modrm, unsigned long *fpu_eip, case 1: /* 8 bit signed displacement */ RE_ENTRANT_CHECK_OFF; - FPU_code_verify_area(1); - FPU_get_user(address, (signed char *) (*fpu_eip)); + FPU_code_access_ok(1); + FPU_get_user(address, (signed char __user *) (*fpu_eip)); RE_ENTRANT_CHECK_ON; (*fpu_eip)++; break; case 2: /* 16 bit displacement */ RE_ENTRANT_CHECK_OFF; - FPU_code_verify_area(2); - FPU_get_user(address, (unsigned short *) (*fpu_eip)); + FPU_code_access_ok(2); + FPU_get_user(address, (unsigned short __user *) (*fpu_eip)); (*fpu_eip) += 2; RE_ENTRANT_CHECK_ON; break; @@ -445,5 +438,5 @@ void *FPU_get_address_16(u_char FPU_modrm, unsigned long *fpu_eip, EXCEPTION(EX_INTERNAL|0x131); } - return (void *)address ; + return (void __user *)address ; }