Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.20 153 lines 5.1 kB view raw
1/* 2 * linux/include/asm-arm/proc-armo/uaccess.h 3 * 4 * Copyright (C) 1996 Russell King 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 */ 10 11/* 12 * The fs functions are implemented on the ARM2 and ARM3 architectures 13 * manually. 14 * Use *_user functions to access user memory with faulting behaving 15 * as though the user is accessing the memory. 16 * Use set_fs(get_ds()) and then the *_user functions to allow them to 17 * access kernel memory. 18 */ 19 20/* 21 * These are the values used to represent the user `fs' and the kernel `ds' 22 * FIXME - the KERNEL_DS should end at 0x03000000 but we want to access ROM at 23 * 0x03400000. ideally we want to forbid access to the IO space inbetween. 24 */ 25#define KERNEL_DS 0x03FFFFFF 26#define USER_DS 0x02000000 27 28extern uaccess_t uaccess_user, uaccess_kernel; 29 30static inline void set_fs (mm_segment_t fs) 31{ 32 current_thread_info()->addr_limit = fs; 33 current->thread.uaccess = (fs == USER_DS ? &uaccess_user : &uaccess_kernel); 34} 35 36#define __range_ok(addr,size) ({ \ 37 unsigned long flag, sum; \ 38 __asm__ __volatile__("subs %1, %0, %3; cmpcs %1, %2; movcs %0, #0" \ 39 : "=&r" (flag), "=&r" (sum) \ 40 : "r" (addr), "Ir" (size), "0" (current_thread_info()->addr_limit) \ 41 : "cc"); \ 42 flag; }) 43 44#define __addr_ok(addr) ({ \ 45 unsigned long flag; \ 46 __asm__ __volatile__("cmp %2, %0; movlo %0, #0" \ 47 : "=&r" (flag) \ 48 : "0" (current_thread_info()->addr_limit), "r" (addr) \ 49 : "cc"); \ 50 (flag == 0); }) 51 52#define __put_user_asm_byte(x,addr,err) \ 53 __asm__ __volatile__( \ 54 " mov r0, %1\n" \ 55 " mov r1, %2\n" \ 56 " mov r2, %0\n" \ 57 " mov lr, pc\n" \ 58 " mov pc, %3\n" \ 59 " mov %0, r2\n" \ 60 : "=r" (err) \ 61 : "r" (x), "r" (addr), "r" (current->thread.uaccess->put_byte), \ 62 "0" (err) \ 63 : "r0", "r1", "r2", "lr") 64 65#define __put_user_asm_half(x,addr,err) \ 66 __asm__ __volatile__( \ 67 " mov r0, %1\n" \ 68 " mov r1, %2\n" \ 69 " mov r2, %0\n" \ 70 " mov lr, pc\n" \ 71 " mov pc, %3\n" \ 72 " mov %0, r2\n" \ 73 : "=r" (err) \ 74 : "r" (x), "r" (addr), "r" (current->thread.uaccess->put_half), \ 75 "0" (err) \ 76 : "r0", "r1", "r2", "lr") 77 78#define __put_user_asm_word(x,addr,err) \ 79 __asm__ __volatile__( \ 80 " mov r0, %1\n" \ 81 " mov r1, %2\n" \ 82 " mov r2, %0\n" \ 83 " mov lr, pc\n" \ 84 " mov pc, %3\n" \ 85 " mov %0, r2\n" \ 86 : "=r" (err) \ 87 : "r" (x), "r" (addr), "r" (current->thread.uaccess->put_word), \ 88 "0" (err) \ 89 : "r0", "r1", "r2", "lr") 90 91#define __put_user_asm_dword(x,addr,err) \ 92 __asm__ __volatile__( \ 93 " mov r0, %1\n" \ 94 " mov r1, %2\n" \ 95 " mov r2, %0\n" \ 96 " mov lr, pc\n" \ 97 " mov pc, %3\n" \ 98 " mov %0, r2\n" \ 99 : "=r" (err) \ 100 : "r" (x), "r" (addr), "r" (current->thread.uaccess->put_dword), \ 101 "0" (err) \ 102 : "r0", "r1", "r2", "lr") 103 104#define __get_user_asm_byte(x,addr,err) \ 105 __asm__ __volatile__( \ 106 " mov r0, %2\n" \ 107 " mov r1, %0\n" \ 108 " mov lr, pc\n" \ 109 " mov pc, %3\n" \ 110 " mov %0, r1\n" \ 111 " mov %1, r0\n" \ 112 : "=r" (err), "=r" (x) \ 113 : "r" (addr), "r" (current->thread.uaccess->get_byte), "0" (err) \ 114 : "r0", "r1", "r2", "lr") 115 116#define __get_user_asm_half(x,addr,err) \ 117 __asm__ __volatile__( \ 118 " mov r0, %2\n" \ 119 " mov r1, %0\n" \ 120 " mov lr, pc\n" \ 121 " mov pc, %3\n" \ 122 " mov %0, r1\n" \ 123 " mov %1, r0\n" \ 124 : "=r" (err), "=r" (x) \ 125 : "r" (addr), "r" (current->thread.uaccess->get_half), "0" (err) \ 126 : "r0", "r1", "r2", "lr") 127 128#define __get_user_asm_word(x,addr,err) \ 129 __asm__ __volatile__( \ 130 " mov r0, %2\n" \ 131 " mov r1, %0\n" \ 132 " mov lr, pc\n" \ 133 " mov pc, %3\n" \ 134 " mov %0, r1\n" \ 135 " mov %1, r0\n" \ 136 : "=r" (err), "=r" (x) \ 137 : "r" (addr), "r" (current->thread.uaccess->get_word), "0" (err) \ 138 : "r0", "r1", "r2", "lr") 139 140#define __do_copy_from_user(to,from,n) \ 141 (n) = current->thread.uaccess->copy_from_user((to),(from),(n)) 142 143#define __do_copy_to_user(to,from,n) \ 144 (n) = current->thread.uaccess->copy_to_user((to),(from),(n)) 145 146#define __do_clear_user(addr,sz) \ 147 (sz) = current->thread.uaccess->clear_user((addr),(sz)) 148 149#define __do_strncpy_from_user(dst,src,count,res) \ 150 (res) = current->thread.uaccess->strncpy_from_user(dst,src,count) 151 152#define __do_strnlen_user(s,n,res) \ 153 (res) = current->thread.uaccess->strnlen_user(s,n)