Linux Audio

Check our new training course

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