-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Original port to early 2.6 kernel using TI COFF toolchain. Brought up to date by Mark Salter <msalter@redhat.com> Signed-off-by: Aurelien Jacquiot <a-jacquiot@ti.com> Signed-off-by: Mark Salter <msalter@redhat.com> Acked-by: Arnd Bergmann <arnd@arndb.de>
- Loading branch information
Aurelien Jacquiot
authored and
Mark Salter
committed
Oct 6, 2011
1 parent
14aa7e8
commit 687b12b
Showing
4 changed files
with
590 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
/* | ||
* Port on Texas Instruments TMS320C6x architecture | ||
* | ||
* Copyright (C) 2004, 2009, 2010, 2011 Texas Instruments Incorporated | ||
* Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com) | ||
* | ||
* Updated for 2.6.34: Mark Salter <msalter@redhat.com> | ||
* | ||
* 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 */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
/* | ||
* Port on Texas Instruments TMS320C6x architecture | ||
* | ||
* Copyright (C) 2004, 2009, 2010, 2011 Texas Instruments Incorporated | ||
* Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com) | ||
* | ||
* Updated for 2.6.3x: Mark Salter <msalter@redhat.com> | ||
* | ||
* 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_THREAD_INFO_H | ||
#define _ASM_C6X_THREAD_INFO_H | ||
|
||
#ifdef __KERNEL__ | ||
|
||
#include <asm/page.h> | ||
|
||
#ifdef CONFIG_4KSTACKS | ||
#define THREAD_SIZE 4096 | ||
#define THREAD_SHIFT 12 | ||
#define THREAD_ORDER 0 | ||
#else | ||
#define THREAD_SIZE 8192 | ||
#define THREAD_SHIFT 13 | ||
#define THREAD_ORDER 1 | ||
#endif | ||
|
||
#define THREAD_START_SP (THREAD_SIZE - 8) | ||
|
||
#ifndef __ASSEMBLY__ | ||
|
||
typedef struct { | ||
unsigned long seg; | ||
} mm_segment_t; | ||
|
||
/* | ||
* low level task data. | ||
*/ | ||
struct thread_info { | ||
struct task_struct *task; /* main task structure */ | ||
struct exec_domain *exec_domain; /* execution domain */ | ||
unsigned long flags; /* low level flags */ | ||
int cpu; /* cpu we're on */ | ||
int preempt_count; /* 0 = preemptable, <0 = BUG */ | ||
mm_segment_t addr_limit; /* thread address space */ | ||
struct restart_block restart_block; | ||
}; | ||
|
||
/* | ||
* macros/functions for gaining access to the thread information structure | ||
* | ||
* preempt_count needs to be 1 initially, until the scheduler is functional. | ||
*/ | ||
#define INIT_THREAD_INFO(tsk) \ | ||
{ \ | ||
.task = &tsk, \ | ||
.exec_domain = &default_exec_domain, \ | ||
.flags = 0, \ | ||
.cpu = 0, \ | ||
.preempt_count = INIT_PREEMPT_COUNT, \ | ||
.addr_limit = KERNEL_DS, \ | ||
.restart_block = { \ | ||
.fn = do_no_restart_syscall, \ | ||
}, \ | ||
} | ||
|
||
#define init_thread_info (init_thread_union.thread_info) | ||
#define init_stack (init_thread_union.stack) | ||
|
||
/* get the thread information struct of current task */ | ||
static inline __attribute__((const)) | ||
struct thread_info *current_thread_info(void) | ||
{ | ||
struct thread_info *ti; | ||
asm volatile (" clr .s2 B15,0,%1,%0\n" | ||
: "=b" (ti) | ||
: "Iu5" (THREAD_SHIFT - 1)); | ||
return ti; | ||
} | ||
|
||
#define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||
|
||
/* thread information allocation */ | ||
#ifdef CONFIG_DEBUG_STACK_USAGE | ||
#define THREAD_FLAGS (GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO) | ||
#else | ||
#define THREAD_FLAGS (GFP_KERNEL | __GFP_NOTRACK) | ||
#endif | ||
|
||
#define alloc_thread_info_node(tsk, node) \ | ||
((struct thread_info *)__get_free_pages(THREAD_FLAGS, THREAD_ORDER)) | ||
|
||
#define free_thread_info(ti) free_pages((unsigned long) (ti), THREAD_ORDER) | ||
#define get_thread_info(ti) get_task_struct((ti)->task) | ||
#define put_thread_info(ti) put_task_struct((ti)->task) | ||
#endif /* __ASSEMBLY__ */ | ||
|
||
#define PREEMPT_ACTIVE 0x10000000 | ||
|
||
/* | ||
* thread information flag bit numbers | ||
* - pending work-to-be-done flags are in LSW | ||
* - other flags in MSW | ||
*/ | ||
#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ | ||
#define TIF_NOTIFY_RESUME 1 /* resumption notification requested */ | ||
#define TIF_SIGPENDING 2 /* signal pending */ | ||
#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ | ||
#define TIF_RESTORE_SIGMASK 4 /* restore signal mask in do_signal() */ | ||
|
||
#define TIF_POLLING_NRFLAG 16 /* true if polling TIF_NEED_RESCHED */ | ||
#define TIF_MEMDIE 17 /* OOM killer killed process */ | ||
|
||
#define TIF_WORK_MASK 0x00007FFE /* work on irq/exception return */ | ||
#define TIF_ALLWORK_MASK 0x00007FFF /* work on any return to u-space */ | ||
|
||
#endif /* __KERNEL__ */ | ||
|
||
#endif /* _ASM_C6X_THREAD_INFO_H */ |
Oops, something went wrong.