-
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.
This patch adds support for thread creation and context switching. Signed-off-by: Ley Foon Tan <lftan@altera.com>
- Loading branch information
Ley Foon Tan
committed
Dec 8, 2014
1 parent
cbd15b3
commit 71995e4
Showing
6 changed files
with
694 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,66 @@ | ||
/* | ||
* Copyright (C) 2010 Tobias Klauser <tklauser@distanz.ch> | ||
* Copyright (C) 1996, 1997, 1998, 1999 by Ralf Baechle | ||
* Copyright (C) 1999 Silicon Graphics, Inc. | ||
* | ||
* based on MIPS asm/mmu_context.h | ||
* | ||
* This file is subject to the terms and conditions of the GNU General Public | ||
* License. See the file "COPYING" in the main directory of this archive | ||
* for more details. | ||
*/ | ||
|
||
#ifndef _ASM_NIOS2_MMU_CONTEXT_H | ||
#define _ASM_NIOS2_MMU_CONTEXT_H | ||
|
||
#include <asm-generic/mm_hooks.h> | ||
|
||
extern void mmu_context_init(void); | ||
extern unsigned long get_pid_from_context(mm_context_t *ctx); | ||
|
||
/* | ||
* For the fast tlb miss handlers, we keep a pointer to the current pgd. | ||
* processor. | ||
*/ | ||
extern pgd_t *pgd_current; | ||
|
||
static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) | ||
{ | ||
} | ||
|
||
/* | ||
* Initialize the context related info for a new mm_struct instance. | ||
* | ||
* Set all new contexts to 0, that way the generation will never match | ||
* the currently running generation when this context is switched in. | ||
*/ | ||
static inline int init_new_context(struct task_struct *tsk, | ||
struct mm_struct *mm) | ||
{ | ||
mm->context = 0; | ||
return 0; | ||
} | ||
|
||
/* | ||
* Destroy context related info for an mm_struct that is about | ||
* to be put to rest. | ||
*/ | ||
static inline void destroy_context(struct mm_struct *mm) | ||
{ | ||
} | ||
|
||
void switch_mm(struct mm_struct *prev, struct mm_struct *next, | ||
struct task_struct *tsk); | ||
|
||
static inline void deactivate_mm(struct task_struct *tsk, | ||
struct mm_struct *mm) | ||
{ | ||
} | ||
|
||
/* | ||
* After we have set current->mm to a new value, this activates | ||
* the context for the new mm so we see the new mappings. | ||
*/ | ||
void activate_mm(struct mm_struct *prev, struct mm_struct *next); | ||
|
||
#endif /* _ASM_NIOS2_MMU_CONTEXT_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,103 @@ | ||
/* | ||
* Copyright (C) 2013 Altera Corporation | ||
* Copyright (C) 2010 Tobias Klauser <tklauser@distanz.ch> | ||
* Copyright (C) 2004 Microtronix Datacom Ltd | ||
* Copyright (C) 2001 Ken Hill (khill@microtronix.com) | ||
* Vic Phillips (vic@microtronix.com) | ||
* | ||
* based on SPARC asm/processor_32.h which is: | ||
* | ||
* Copyright (C) 1994 David S. Miller | ||
* | ||
* This file is subject to the terms and conditions of the GNU General Public | ||
* License. See the file "COPYING" in the main directory of this archive | ||
* for more details. | ||
*/ | ||
|
||
#ifndef _ASM_NIOS2_PROCESSOR_H | ||
#define _ASM_NIOS2_PROCESSOR_H | ||
|
||
#include <asm/ptrace.h> | ||
#include <asm/registers.h> | ||
#include <asm/page.h> | ||
|
||
#define NIOS2_FLAG_KTHREAD 0x00000001 /* task is a kernel thread */ | ||
|
||
#define NIOS2_OP_NOP 0x1883a | ||
#define NIOS2_OP_BREAK 0x3da03a | ||
|
||
#ifdef __KERNEL__ | ||
|
||
#define STACK_TOP TASK_SIZE | ||
#define STACK_TOP_MAX STACK_TOP | ||
|
||
#endif /* __KERNEL__ */ | ||
|
||
/* Kuser helpers is mapped to this user space address */ | ||
#define KUSER_BASE 0x1000 | ||
#define KUSER_SIZE (PAGE_SIZE) | ||
#ifndef __ASSEMBLY__ | ||
|
||
/* | ||
* Default implementation of macro that returns current | ||
* instruction pointer ("program counter"). | ||
*/ | ||
#define current_text_addr() ({ __label__ _l; _l: &&_l; }) | ||
|
||
# define TASK_SIZE 0x7FFF0000UL | ||
# define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3)) | ||
|
||
/* The Nios processor specific thread struct. */ | ||
struct thread_struct { | ||
struct pt_regs *kregs; | ||
|
||
/* Context switch saved kernel state. */ | ||
unsigned long ksp; | ||
unsigned long kpsr; | ||
}; | ||
|
||
#define INIT_MMAP \ | ||
{ &init_mm, (0), (0), __pgprot(0x0), VM_READ | VM_WRITE | VM_EXEC } | ||
|
||
# define INIT_THREAD { \ | ||
.kregs = NULL, \ | ||
.ksp = 0, \ | ||
.kpsr = 0, \ | ||
} | ||
|
||
extern void start_thread(struct pt_regs *regs, unsigned long pc, | ||
unsigned long sp); | ||
|
||
struct task_struct; | ||
|
||
/* Free all resources held by a thread. */ | ||
static inline void release_thread(struct task_struct *dead_task) | ||
{ | ||
} | ||
|
||
/* Free current thread data structures etc.. */ | ||
static inline void exit_thread(void) | ||
{ | ||
} | ||
|
||
/* Return saved PC of a blocked thread. */ | ||
#define thread_saved_pc(tsk) ((tsk)->thread.kregs->ea) | ||
|
||
extern unsigned long get_wchan(struct task_struct *p); | ||
|
||
/* Prepare to copy thread state - unlazy all lazy status */ | ||
#define prepare_to_copy(tsk) do { } while (0) | ||
|
||
#define task_pt_regs(p) \ | ||
((struct pt_regs *)(THREAD_SIZE + task_stack_page(p)) - 1) | ||
|
||
/* Used by procfs */ | ||
#define KSTK_EIP(tsk) ((tsk)->thread.kregs->ea) | ||
#define KSTK_ESP(tsk) ((tsk)->thread.kregs->sp) | ||
|
||
#define cpu_relax() barrier() | ||
#define cpu_relax_lowlatency() cpu_relax() | ||
|
||
#endif /* __ASSEMBLY__ */ | ||
|
||
#endif /* _ASM_NIOS2_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,31 @@ | ||
/* | ||
* Copyright (C) 2004 Microtronix Datacom Ltd. | ||
* | ||
* This file is subject to the terms and conditions of the GNU General Public | ||
* License. See the file "COPYING" in the main directory of this archive | ||
* for more details. | ||
*/ | ||
#ifndef _ASM_NIOS2_SWITCH_TO_H | ||
#define _ASM_NIOS2_SWITCH_TO_H | ||
|
||
/* | ||
* switch_to(n) should switch tasks to task ptr, first checking that | ||
* ptr isn't the current task, in which case it does nothing. This | ||
* also clears the TS-flag if the task we switched to has used the | ||
* math co-processor latest. | ||
*/ | ||
#define switch_to(prev, next, last) \ | ||
{ \ | ||
void *_last; \ | ||
__asm__ __volatile__ ( \ | ||
"mov r4, %1\n" \ | ||
"mov r5, %2\n" \ | ||
"call resume\n" \ | ||
"mov %0,r4\n" \ | ||
: "=r" (_last) \ | ||
: "r" (prev), "r" (next) \ | ||
: "r4", "r5", "r7", "r8", "ra"); \ | ||
(last) = _last; \ | ||
} | ||
|
||
#endif /* _ASM_NIOS2_SWITCH_TO_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,120 @@ | ||
/* | ||
* NiosII low-level thread information | ||
* | ||
* Copyright (C) 2011 Tobias Klauser <tklauser@distanz.ch> | ||
* Copyright (C) 2004 Microtronix Datacom Ltd. | ||
* | ||
* Based on asm/thread_info_no.h from m68k which is: | ||
* | ||
* Copyright (C) 2002 David Howells <dhowells@redhat.com> | ||
* | ||
* This file is subject to the terms and conditions of the GNU General Public | ||
* License. See the file "COPYING" in the main directory of this archive | ||
* for more details. | ||
*/ | ||
|
||
#ifndef _ASM_NIOS2_THREAD_INFO_H | ||
#define _ASM_NIOS2_THREAD_INFO_H | ||
|
||
#ifdef __KERNEL__ | ||
|
||
/* | ||
* Size of the kernel stack for each process. | ||
*/ | ||
#define THREAD_SIZE_ORDER 1 | ||
#define THREAD_SIZE 8192 /* 2 * PAGE_SIZE */ | ||
|
||
#ifndef __ASSEMBLY__ | ||
|
||
typedef struct { | ||
unsigned long seg; | ||
} mm_segment_t; | ||
|
||
/* | ||
* low level task data that entry.S needs immediate access to | ||
* - this struct should fit entirely inside of one cache line | ||
* - this struct shares the supervisor stack pages | ||
* - if the contents of this structure are changed, the assembly constants | ||
* must also be changed | ||
*/ | ||
struct thread_info { | ||
struct task_struct *task; /* main task structure */ | ||
struct exec_domain *exec_domain; /* execution domain */ | ||
unsigned long flags; /* low level flags */ | ||
__u32 cpu; /* current CPU */ | ||
int preempt_count; /* 0 => preemptable,<0 => BUG */ | ||
mm_segment_t addr_limit; /* thread address space: | ||
0-0x7FFFFFFF for user-thead | ||
0-0xFFFFFFFF for kernel-thread | ||
*/ | ||
struct restart_block restart_block; | ||
struct pt_regs *regs; | ||
}; | ||
|
||
/* | ||
* 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) | ||
|
||
/* how to get the thread information struct from C */ | ||
static inline struct thread_info *current_thread_info(void) | ||
{ | ||
register unsigned long sp asm("sp"); | ||
|
||
return (struct thread_info *)(sp & ~(THREAD_SIZE - 1)); | ||
} | ||
#endif /* !__ASSEMBLY__ */ | ||
|
||
/* | ||
* thread information flags | ||
* - these are process state flags that various assembly files may need to | ||
* access | ||
* - 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_MEMDIE 4 /* is terminating due to OOM killer */ | ||
#define TIF_SECCOMP 5 /* secure computing */ | ||
#define TIF_SYSCALL_AUDIT 6 /* syscall auditing active */ | ||
#define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal() */ | ||
|
||
#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling | ||
TIF_NEED_RESCHED */ | ||
|
||
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) | ||
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) | ||
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) | ||
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) | ||
#define _TIF_SECCOMP (1 << TIF_SECCOMP) | ||
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) | ||
#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) | ||
#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) | ||
|
||
/* work to do on interrupt/exception return */ | ||
#define _TIF_WORK_MASK 0x0000FFFE | ||
|
||
/* work to do on any return to u-space */ | ||
# define _TIF_ALLWORK_MASK 0x0000FFFF | ||
|
||
#endif /* __KERNEL__ */ | ||
|
||
#endif /* _ASM_NIOS2_THREAD_INFO_H */ |
Oops, something went wrong.