~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/include/asm-mips64/paccess.h

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* $Id: paccess.h,v 1.2 2000/01/21 22:34:07 ralf Exp $
  2  *
  3  * This file is subject to the terms and conditions of the GNU General Public
  4  * License.  See the file "COPYING" in the main directory of this archive
  5  * for more details.
  6  *
  7  * Copyright (C) 1996, 1997, 1998, 1999, 2000 by Ralf Baechle
  8  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
  9  *
 10  * Protected memory access.  Used for everything that might take revenge
 11  * by sending a DBE error like accessing possibly non-existant memory or
 12  * devices.
 13  */
 14 #ifndef _ASM_PACCESS_H
 15 #define _ASM_PACCESS_H
 16 
 17 #include <linux/errno.h>
 18 
 19 #define put_dbe(x,ptr) __put_dbe((x),(ptr),sizeof(*(ptr)))
 20 #define get_dbe(x,ptr) __get_dbe((x),(ptr),sizeof(*(ptr)))
 21 
 22 struct __large_pstruct { unsigned long buf[100]; };
 23 #define __mp(x) (*(struct __large_pstruct *)(x))
 24 
 25 #define __get_dbe(x,ptr,size) ({ \
 26 long __gu_err; \
 27 __typeof(*(ptr)) __gu_val; \
 28 long __gu_addr; \
 29 __asm__("":"=r" (__gu_val)); \
 30 __gu_addr = (long) (ptr); \
 31 __asm__("":"=r" (__gu_err)); \
 32 switch (size) { \
 33 case 1: __get_dbe_asm("lb"); break; \
 34 case 2: __get_dbe_asm("lh"); break; \
 35 case 4: __get_dbe_asm("lw"); break; \
 36 case 8:  __get_dbe_asm("ld"); break; \
 37 default: __get_dbe_unknown(); break; \
 38 } x = (__typeof__(*(ptr))) __gu_val; __gu_err; })
 39 
 40 #define __get_dbe_asm(insn) \
 41 ({ \
 42 __asm__ __volatile__( \
 43         "1:\t" insn "\t%1,%2\n\t" \
 44         "move\t%0,$0\n" \
 45         "2:\n\t" \
 46         ".section\t.fixup,\"ax\"\n" \
 47         "3:\tli\t%0,%3\n\t" \
 48         "move\t%1,$0\n\t" \
 49         "j\t2b\n\t" \
 50         ".previous\n\t" \
 51         ".section\t__dbe_table,\"a\"\n\t" \
 52         ".dword\t1b,3b\n\t" \
 53         ".previous" \
 54         :"=r" (__gu_err), "=r" (__gu_val) \
 55         :"o" (__mp(__gu_addr)), "i" (-EFAULT)); })
 56 
 57 extern void __get_dbe_unknown(void);
 58 
 59 #define __put_dbe(x,ptr,size) ({ \
 60 long __pu_err; \
 61 __typeof__(*(ptr)) __pu_val; \
 62 long __pu_addr; \
 63 __pu_val = (x); \
 64 __pu_addr = (long) (ptr); \
 65 __asm__("":"=r" (__pu_err)); \
 66 switch (size) { \
 67 case 1: __put_dbe_asm("sb"); break; \
 68 case 2: __put_dbe_asm("sh"); break; \
 69 case 4: __put_dbe_asm("sw"); break; \
 70 case 8: __put_dbe_asm("sd"); break; \
 71 default: __put_dbe_unknown(); break; \
 72 } __pu_err; })
 73 
 74 #define __put_dbe_asm(insn) \
 75 ({ \
 76 __asm__ __volatile__( \
 77         "1:\t" insn "\t%1,%2\n\t" \
 78         "move\t%0,$0\n" \
 79         "2:\n\t" \
 80         ".section\t.fixup,\"ax\"\n" \
 81         "3:\tli\t%0,%3\n\t" \
 82         "j\t2b\n\t" \
 83         ".previous\n\t" \
 84         ".section\t__dbe_table,\"a\"\n\t" \
 85         ".dword\t1b,3b\n\t" \
 86         ".previous" \
 87         :"=r" (__pu_err) \
 88         :"r" (__pu_val), "o" (__mp(__pu_addr)), "i" (-EFAULT)); })
 89 
 90 extern void __put_dbe_unknown(void);
 91 
 92 #endif /* _ASM_PACCESS_H */
 93 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.