diff options
Diffstat (limited to 'include/asm-blackfin/processor.h')
| -rw-r--r-- | include/asm-blackfin/processor.h | 174 | 
1 files changed, 174 insertions, 0 deletions
| diff --git a/include/asm-blackfin/processor.h b/include/asm-blackfin/processor.h new file mode 100644 index 000000000..19bd72010 --- /dev/null +++ b/include/asm-blackfin/processor.h @@ -0,0 +1,174 @@ +/* + * U-boot - processor.h + * + * Copyright (c) 2005 blackfin.uclinux.org + * + * This file is based on + * include/asm-m68k/processor.h + * Changes made by Akbar Hussain Lineo, Inc, May 2001 for BLACKFIN + * Copyright (C) 1995 Hamish Macdonald + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef __ASM_BLACKFIN_PROCESSOR_H +#define __ASM_BLACKFIN_PROCESSOR_H + +/* + * Default implementation of macro that returns current + * instruction pointer ("program counter"). + */ +#define current_text_addr()	({ __label__ _l; _l: &&_l;}) + +#include <linux/config.h> +#include <asm/segment.h> +#include <asm/ptrace.h> +#include <asm/current.h> + +extern inline unsigned long rdusp(void) +{ +	unsigned long usp; + +	__asm__ __volatile__("%0 = usp;\n\t":"=da"(usp)); +	return usp; +} + +extern inline void wrusp(unsigned long usp) +{ +	__asm__ __volatile__("usp = %0;\n\t"::"da"(usp)); +} + +/* + * User space process size: 3.75GB. This is hardcoded into a few places, + * so don't change it unless you know what you are doing. + */ +#define TASK_SIZE		(0xF0000000UL) + +/* + * Bus types + */ +#define EISA_bus		0 +#define MCA_bus			0 + +/*  There is no pc register avaliable for BLACKFIN, so we are going to get + *  it indirectly + */ + +#if 0 +inline unsigned long obtain_pc_indirectly(void) +{ +	unsigned long pc; +	__asm__ __volatile__("%0 = rets;\n":"=d"(pc)); +	return (pc - 4);	/* call pcrel24 is 4 bytes long  */ +} +#endif + +/* + * if you change this structure, you must change the code and offsets + * in m68k/machasm.S + */ + +struct thread_struct { +	unsigned long ksp;	/* kernel stack pointer */ +	unsigned long usp;	/* user stack pointer */ +	unsigned short seqstat;	/* saved status register */ +	unsigned long esp0;	/* points to SR of stack frame pt_regs */ +	unsigned long pc;	/* instruction pointer */ +}; + +#define INIT_MMAP { &init_mm, 0, 0x40000000, NULL, __pgprot(_PAGE_PRESENT|_PAGE_ACCESSED), VM_READ | VM_WRITE | VM_EXEC, 1, NULL, NULL } + +#define INIT_THREAD  { \ +	sizeof(init_stack) + (unsigned long) init_stack, 0, \ +	PS_S, 0\ +} + +/* + * Do necessary setup to start up a newly executed thread. + * + * pass the data segment into user programs if it exists, + * it can't hurt anything as far as I can tell + */ +#define start_thread(_regs, _pc, _usp)           \ +do {                                             \ +	set_fs(USER_DS); /* reads from user space */ \ +	(_regs)->pc = (_pc);                         \ +	if (current->mm)                             \ +		(_regs)->r5 = current->mm->start_data;   \ +	(_regs)->seqstat &= ~0x0c00;                      \ +	wrusp(_usp);                                 \ +	/* Adde by HuTao, May 26, 2003 3:39PM */\ +	if ((_regs)->ipend & 0x8000) /* check whether system in supper mode - StChen */\ +		(_regs)->ipend = 0x0;\ +} while(0) + +/* Forward declaration, a strange C thing */ +struct task_struct; + +/* Free all resources held by a thread. */ +static inline void release_thread(struct task_struct *dead_task) +{ +} + +extern int kernel_thread(int (*fn) (void *), void *arg, +			 unsigned long flags); + +#define copy_segments(tsk, mm)		do { } while (0) +#define release_segments(mm)		do { } while (0) +#define forget_segments()		do { } while (0) + +/* + * Free current thread data structures etc.. + */ +static inline void exit_thread(void) +{ +} + +/* + * Return saved PC of a blocked thread. + */ +extern inline unsigned long thread_saved_pc(struct thread_struct *t) +{ +	extern void scheduling_functions_start_here(void); +	extern void scheduling_functions_end_here(void); +	return 0; +} + +unsigned long get_wchan(struct task_struct *p); + +#define	KSTK_EIP(tsk)	\ +	({			\ +	unsigned long eip = 0;	 \ +	if ((tsk)->thread.esp0 > PAGE_SIZE && \ +		MAP_NR((tsk)->thread.esp0) < max_mapnr) \ +		eip = ((struct pt_regs *) (tsk)->thread.esp0)->pc; \ +	eip; }) +#define	KSTK_ESP(tsk)	((tsk) == current ? rdusp() : (tsk)->thread.usp) +#define THREAD_SIZE	(2*PAGE_SIZE) + +/* Allocation and freeing of basic task resources. */ +#define alloc_task_struct() \ +	((struct task_struct *) __get_free_pages(GFP_KERNEL,1)) +#define free_task_struct(p)	free_pages((unsigned long)(p),1) +#define get_task_struct(tsk)	atomic_inc(&mem_map[MAP_NR(tsk)].count) + +#define init_task		(init_task_union.task) +#define init_stack		(init_task_union.stack) + +#endif |