From: Jun Sun <jsun@mvista.com>
To: Carsten Langgaard <carstenl@mips.com>
Cc: linux-mips@oss.sgi.com
Subject: Re: __access_ok
Date: Mon, 17 Jun 2002 12:55:08 -0700 [thread overview]
Message-ID: <3D0E3E9C.4070702@mvista.com> (raw)
In-Reply-To: 3D0DCDCB.252F5565@mips.com
Just to be nit-picking, the end point should be (addr + size - 1).
Jun
Carsten Langgaard wrote:
> The __access_ok macro in include/asm-mips64/uaccess.h need to be changed
> in order to work correctly, it's a copy from the 32-bit kernel.
> It's not good enough to simply check for the "sign bit" of the address.
> The area between USEG (XUSEG) and KSEG0 will in 64-bit addressing mode
> generate an address error, if
> accessed. The size of the area depend on the number of virtual
> addressing bits, implemented in the CPU.
>
> I have tried to come up with a patch, please see below. Any thought ?
> I also changed the macro in arch/mips64/kernel/unaligned.c
>
> /Carsten
>
>
> Index: include/asm-mips64//uaccess.h
> ===================================================================
> RCS file:
> /home/repository/sw/linux-2.4.18/include/asm-mips64/uaccess.h,v
> retrieving revision 1.1.1.1
> diff -u -r1.1.1.1 uaccess.h
> --- include/asm-mips64//uaccess.h 4 Mar 2002 11:13:26 -0000
> 1.1.1.1
> +++ include/asm-mips64//uaccess.h 17 Jun 2002 11:35:32 -0000
> @@ -12,6 +12,8 @@
> #include <linux/errno.h>
> #include <linux/sched.h>
>
> +#include <asm/addrspace.h>
> +
> #define STR(x) __STR(x)
> #define __STR(x) #x
>
> @@ -40,16 +42,23 @@
> * than tests.
> *
> * Address valid if:
> - * - "addr" doesn't have any high-bits set
> - * - AND "size" doesn't have any high-bits set
> - * - AND "addr+size" doesn't have any high-bits set
> - * - OR we are in kernel mode.
> + * - In user mode and "addr" and "addr+size" in USEG (or XUSEG).
> + * - OR we are in kernel mode and "addr" and "addr+size" isn't in the
> + * area between USEG (XUSEG) and KSEG0.
> */
> #define
> __ua_size(size) \
> (__builtin_constant_p(size) && (signed long) (size) > 0 ? 0 :
> (size))
>
> -#define __access_ok(addr,size,mask)
> \
> - (((signed long)((mask)&(addr | (addr + size) |
> __ua_size(size)))) >= 0)
> +static inline int
> +__access_ok(unsigned long addr, unsigned long size, long mask)
> +{
> + if (((mask) && ((addr | (addr+size)) >= KUSIZE)) ||
> + (((addr | (addr+size)) < K0BASE) &&
> + ((addr | (addr+size)) >= KUSIZE)))
> + return 0;
> + else
> + return 1;
> +}
>
> #define __access_mask ((long)(get_fs().seg))
>
>
> Index: arch/mips64/kernel/unaligned.c
> ===================================================================
> RCS file:
> /home/repository/sw/linux-2.4.18/arch/mips64/kernel/unaligned.c,v
> retrieving revision 1.2
> diff -u -r1.2 unaligned.c
> --- arch/mips64/kernel/unaligned.c 23 May 2002 11:11:45 -0000
> 1.2
> +++ arch/mips64/kernel/unaligned.c 17 Jun 2002 11:51:30 -0000
> @@ -89,11 +89,14 @@
> #define __STR(x) #x
>
> /*
> - * User code may only access USEG; kernel code may access the
> - * entire address space.
> + * User code may only access USEG;
> + * Kernel code may access the entire address space, except the area
> between
> + * USEG (XUSEG) and KSEG0.
> */
> -#define check_axs(pc,a,s) \
> - if ((long)(~(pc) & ((a) | ((a)+(s)))) < 0) \
> +#define check_axs(pc,a,s)
> \
> + if (((pc < KUSIZE) && (((a) | ((a)+(s))) >= KUSIZE))
> || \
> + ((((a) | ((a)+(s))) < K0BASE) &&
> \
> + (((a) | ((a)+(s))) >= KUSIZE)))
> \
> goto sigbus;
>
>
>
> --
> _ _ ____ ___ Carsten Langgaard Mailto:carstenl@mips.com
> |\ /|||___)(___ MIPS Denmark Direct: +45 4486 5527
> | \/ ||| ____) Lautrupvang 4B Switch: +45 4486 5555
> TECHNOLOGIES 2750 Ballerup Fax...: +45 4486 5556
> Denmark http://www.mips.com
>
>
>
>
next prev parent reply other threads:[~2002-06-17 20:55 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-06-17 11:53 __access_ok Carsten Langgaard
2002-06-17 16:24 ` __access_ok Justin Carlson
2002-06-18 7:44 ` __access_ok Carsten Langgaard
2002-06-17 19:55 ` Jun Sun [this message]
2002-06-18 7:38 ` __access_ok Carsten Langgaard
2002-06-19 9:17 ` __access_ok Ralf Baechle
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3D0E3E9C.4070702@mvista.com \
--to=jsun@mvista.com \
--cc=carstenl@mips.com \
--cc=linux-mips@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.