at v2.6.21 3.8 kB view raw
1/* 2 * linux/include/asm-arm26/processor.h 3 * 4 * Copyright (C) 1995 Russell King 5 * Copyright (C) 2003 Ian Molton 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation. 10 */ 11 12#ifndef __ASM_ARM_PROCESSOR_H 13#define __ASM_ARM_PROCESSOR_H 14 15/* 16 * Default implementation of macro that returns current 17 * instruction pointer ("program counter"). 18 */ 19#define current_text_addr() ({ __label__ _l; _l: &&_l;}) 20 21#ifdef __KERNEL__ 22 23#include <asm/atomic.h> 24#include <asm/ptrace.h> 25#include <linux/string.h> 26 27#define KERNEL_STACK_SIZE 4096 28 29typedef struct { 30 void (*put_byte)(void); /* Special calling convention */ 31 void (*get_byte)(void); /* Special calling convention */ 32 void (*put_half)(void); /* Special calling convention */ 33 void (*get_half)(void); /* Special calling convention */ 34 void (*put_word)(void); /* Special calling convention */ 35 void (*get_word)(void); /* Special calling convention */ 36 void (*put_dword)(void); /* Special calling convention */ 37 unsigned long (*copy_from_user)(void *to, const void *from, unsigned long sz); 38 unsigned long (*copy_to_user)(void *to, const void *from, unsigned long sz); 39 unsigned long (*clear_user)(void *addr, unsigned long sz); 40 unsigned long (*strncpy_from_user)(char *to, const char *from, unsigned long sz); 41 unsigned long (*strnlen_user)(const char *s, long n); 42} uaccess_t; 43 44extern uaccess_t uaccess_user, uaccess_kernel; 45 46#define EXTRA_THREAD_STRUCT \ 47 uaccess_t *uaccess; /* User access functions*/ 48 49#define EXTRA_THREAD_STRUCT_INIT \ 50 .uaccess = &uaccess_kernel, 51 52// FIXME?!! 53 54#define start_thread(regs,pc,sp) \ 55({ \ 56 unsigned long *stack = (unsigned long *)sp; \ 57 set_fs(USER_DS); \ 58 memzero(regs->uregs, sizeof (regs->uregs)); \ 59 regs->ARM_pc = pc | ~0xfc000003; /* pc */ \ 60 regs->ARM_sp = sp; /* sp */ \ 61 regs->ARM_r2 = stack[2]; /* r2 (envp) */ \ 62 regs->ARM_r1 = stack[1]; /* r1 (argv) */ \ 63 regs->ARM_r0 = stack[0]; /* r0 (argc) */ \ 64}) 65 66#define KSTK_EIP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1020]) 67#define KSTK_ESP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1018]) 68 69struct debug_entry { 70 u32 address; 71 u32 insn; 72}; 73 74struct debug_info { 75 int nsaved; 76 struct debug_entry bp[2]; 77}; 78 79struct thread_struct { 80 /* fault info */ 81 unsigned long address; 82 unsigned long trap_no; 83 unsigned long error_code; 84 /* debugging */ 85 struct debug_info debug; 86 EXTRA_THREAD_STRUCT 87}; 88 89#define INIT_THREAD { \ 90EXTRA_THREAD_STRUCT_INIT \ 91} 92 93/* Forward declaration, a strange C thing */ 94struct task_struct; 95 96/* Free all resources held by a thread. */ 97extern void release_thread(struct task_struct *); 98 99unsigned long get_wchan(struct task_struct *p); 100 101#define cpu_relax() barrier() 102 103/* Prepare to copy thread state - unlazy all lazy status */ 104#define prepare_to_copy(tsk) do { } while (0) 105 106/* 107 * Create a new kernel thread 108 */ 109extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); 110 111#endif 112 113#endif /* __ASM_ARM_PROCESSOR_H */