diff options
Diffstat (limited to 'arch/c6x/include/asm/processor.h')
| -rw-r--r-- | arch/c6x/include/asm/processor.h | 132 | 
1 files changed, 132 insertions, 0 deletions
diff --git a/arch/c6x/include/asm/processor.h b/arch/c6x/include/asm/processor.h new file mode 100644 index 000000000000..8154c4ee8c9c --- /dev/null +++ b/arch/c6x/include/asm/processor.h @@ -0,0 +1,132 @@ +/* + *  Port on Texas Instruments TMS320C6x architecture + * + *  Copyright (C) 2004, 2009, 2010, 2011 Texas Instruments Incorporated + *  Author: Aurelien Jacquiot ([email protected]) + * + *  Updated for 2.6.34: Mark Salter <[email protected]> + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License version 2 as + *  published by the Free Software Foundation. + */ +#ifndef _ASM_C6X_PROCESSOR_H +#define _ASM_C6X_PROCESSOR_H + +#include <asm/ptrace.h> +#include <asm/page.h> +#include <asm/current.h> + +/* + * Default implementation of macro that returns current + * instruction pointer ("program counter"). + */ +#define current_text_addr()			\ +({						\ +	void *__pc;				\ +	asm("mvc .S2 pce1,%0\n" : "=b"(__pc));	\ +	__pc;					\ +}) + +/* + * User space process size. This is mostly meaningless for NOMMU + * but some C6X processors may have RAM addresses up to 0xFFFFFFFF. + * Since calls like mmap() can return an address or an error, we + * have to allow room for error returns when code does something + * like: + * + *       addr = do_mmap(...) + *       if ((unsigned long)addr >= TASK_SIZE) + *            ... its an error code, not an address ... + * + * Here, we allow for 4096 error codes which means we really can't + * use the last 4K page on systems with RAM extending all the way + * to the end of the 32-bit address space. + */ +#define TASK_SIZE	0xFFFFF000 + +/* + * This decides where the kernel will search for a free chunk of vm + * space during mmap's. We won't be using it + */ +#define TASK_UNMAPPED_BASE	0 + +struct thread_struct { +	unsigned long long b15_14; +	unsigned long long a15_14; +	unsigned long long b13_12; +	unsigned long long a13_12; +	unsigned long long b11_10; +	unsigned long long a11_10; +	unsigned long long ricl_icl; +	unsigned long  usp;		/* user stack pointer */ +	unsigned long  pc;		/* kernel pc */ +	unsigned long  wchan; +}; + +#define INIT_THREAD					\ +{							\ +	.usp = 0,					\ +	.wchan = 0,					\ +} + +#define INIT_MMAP { \ +	&init_mm, 0, 0, NULL, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, 1, \ +	NULL, NULL } + +#define task_pt_regs(task) \ +	((struct pt_regs *)(THREAD_START_SP + task_stack_page(task)) - 1) + +#define alloc_kernel_stack()	__get_free_page(GFP_KERNEL) +#define free_kernel_stack(page) free_page((page)) + + +/* Forward declaration, a strange C thing */ +struct task_struct; + +extern void start_thread(struct pt_regs *regs, unsigned int pc, +			 unsigned long usp); + +/* Free all resources held by a thread. */ +static inline void release_thread(struct task_struct *dead_task) +{ +} + +/* Prepare to copy thread state - unlazy all lazy status */ +#define prepare_to_copy(tsk)	do { } while (0) + +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) + +/* + * saved PC of a blocked thread. + */ +#define thread_saved_pc(tsk) (task_pt_regs(tsk)->pc) + +/* + * saved kernel SP and DP of a blocked thread. + */ +#ifdef _BIG_ENDIAN +#define thread_saved_ksp(tsk) \ +	(*(unsigned long *)&(tsk)->thread.b15_14) +#define thread_saved_dp(tsk) \ +	(*(((unsigned long *)&(tsk)->thread.b15_14) + 1)) +#else +#define thread_saved_ksp(tsk) \ +	(*(((unsigned long *)&(tsk)->thread.b15_14) + 1)) +#define thread_saved_dp(tsk) \ +	(*(unsigned long *)&(tsk)->thread.b15_14) +#endif + +extern unsigned long get_wchan(struct task_struct *p); + +#define KSTK_EIP(tsk)	(task_pt_regs(task)->pc) +#define	KSTK_ESP(tsk)	(task_pt_regs(task)->sp) + +#define cpu_relax()		do { } while (0) + +extern const struct seq_operations cpuinfo_op; + +#endif /* ASM_C6X_PROCESSOR_H */  |