Logo Search packages:      
Sourcecode: linux version File versions

paccess.h

/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (C) 1996, 1997, 1998, 1999, 2000 by Ralf Baechle
 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
 *
 * Protected memory access.  Used for everything that might take revenge
 * by sending a DBE error like accessing possibly non-existant memory or
 * devices.
 */
#ifndef _ASM_PACCESS_H
#define _ASM_PACCESS_H

#include <linux/errno.h>

#ifdef CONFIG_32BIT
#define __PA_ADDR ".word"
#endif
#ifdef CONFIG_64BIT
#define __PA_ADDR ".dword"
#endif

extern asmlinkage void handle_ibe(void);
extern asmlinkage void handle_dbe(void);

#define put_dbe(x, ptr) __put_dbe((x), (ptr), sizeof(*(ptr)))
#define get_dbe(x, ptr) __get_dbe((x), (ptr), sizeof(*(ptr)))

struct __large_pstruct { unsigned long buf[100]; };
#define __mp(x) (*(struct __large_pstruct *)(x))

#define __get_dbe(x, ptr, size)                                   \
({                                                    \
      long __gu_err;                                        \
      __typeof__(*(ptr)) __gu_val;                          \
      unsigned long __gu_addr;                              \
      __asm__("":"=r" (__gu_val));                          \
      __gu_addr = (unsigned long) (ptr);                    \
      __asm__("":"=r" (__gu_err));                          \
      switch (size) {                                       \
      case 1: __get_dbe_asm("lb"); break;                   \
      case 2: __get_dbe_asm("lh"); break;                   \
      case 4: __get_dbe_asm("lw"); break;                   \
      case 8:  __get_dbe_asm("ld"); break;                        \
      default: __get_dbe_unknown(); break;                        \
      }                                               \
      x = (__typeof__(*(ptr))) __gu_val;                    \
      __gu_err;                                       \
})

#define __get_dbe_asm(insn)                                 \
{                                                     \
      __asm__ __volatile__(                                 \
      "1:\t" insn "\t%1,%2\n\t"                             \
      "move\t%0,$0\n"                                       \
      "2:\n\t"                                        \
      ".section\t.fixup,\"ax\"\n"                           \
      "3:\tli\t%0,%3\n\t"                                   \
      "move\t%1,$0\n\t"                               \
      "j\t2b\n\t"                                     \
      ".previous\n\t"                                       \
      ".section\t__dbe_table,\"a\"\n\t"                     \
      __PA_ADDR "\t1b, 3b\n\t"                              \
      ".previous"                                     \
      :"=r" (__gu_err), "=r" (__gu_val)                     \
      :"o" (__mp(__gu_addr)), "i" (-EFAULT));                     \
}

extern void __get_dbe_unknown(void);

#define __put_dbe(x, ptr, size)                                   \
({                                                    \
      long __pu_err;                                        \
      __typeof__(*(ptr)) __pu_val;                          \
      long __pu_addr;                                       \
      __pu_val = (x);                                       \
      __pu_addr = (long) (ptr);                             \
      __asm__("":"=r" (__pu_err));                          \
      switch (size) {                                       \
      case 1: __put_dbe_asm("sb"); break;                   \
      case 2: __put_dbe_asm("sh"); break;                   \
      case 4: __put_dbe_asm("sw"); break;                   \
      case 8: __put_dbe_asm("sd"); break;                   \
      default: __put_dbe_unknown(); break;                        \
      }                                               \
      __pu_err;                                       \
})

#define __put_dbe_asm(insn)                                 \
{                                                     \
      __asm__ __volatile__(                                 \
      "1:\t" insn "\t%1,%2\n\t"                             \
      "move\t%0,$0\n"                                       \
      "2:\n\t"                                        \
      ".section\t.fixup,\"ax\"\n"                           \
      "3:\tli\t%0,%3\n\t"                                   \
      "j\t2b\n\t"                                     \
      ".previous\n\t"                                       \
      ".section\t__dbe_table,\"a\"\n\t"                     \
      __PA_ADDR "\t1b, 3b\n\t"                              \
      ".previous"                                     \
      : "=r" (__pu_err)                               \
      : "r" (__pu_val), "o" (__mp(__pu_addr)), "i" (-EFAULT));    \
}

extern void __put_dbe_unknown(void);

extern unsigned long search_dbe_table(unsigned long addr);

#endif /* _ASM_PACCESS_H */

Generated by  Doxygen 1.6.0   Back to index