-
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 includes copy_thread(), start_thread() implementation and cpu_context structure definition. nds32 uses $r25 to get current task_struct. Signed-off-by: Vincent Chen <vincentc@andestech.com> Signed-off-by: Greentime Hu <greentime@andestech.com> Acked-by: Arnd Bergmann <arnd@arndb.de>
- Loading branch information
Greentime Hu
committed
Feb 22, 2018
1 parent
7de9cf4
commit a15e9ff
Showing
4 changed files
with
399 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,12 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
// Copyright (C) 2005-2017 Andes Technology Corporation | ||
|
||
#ifndef _ASM_NDS32_CURRENT_H | ||
#define _ASM_NDS32_CURRENT_H | ||
|
||
#ifndef __ASSEMBLY__ | ||
register struct task_struct *current asm("$r25"); | ||
#endif /* __ASSEMBLY__ */ | ||
#define tsk $r25 | ||
|
||
#endif /* _ASM_NDS32_CURRENT_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 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
// Copyright (C) 2005-2017 Andes Technology Corporation | ||
|
||
#ifndef __ASM_NDS32_PROCESSOR_H | ||
#define __ASM_NDS32_PROCESSOR_H | ||
|
||
/* | ||
* Default implementation of macro that returns current | ||
* instruction pointer ("program counter"). | ||
*/ | ||
#define current_text_addr() ({ __label__ _l; _l: &&_l;}) | ||
|
||
#ifdef __KERNEL__ | ||
|
||
#include <asm/ptrace.h> | ||
#include <asm/types.h> | ||
#include <asm/sigcontext.h> | ||
|
||
#define KERNEL_STACK_SIZE PAGE_SIZE | ||
#define STACK_TOP TASK_SIZE | ||
#define STACK_TOP_MAX TASK_SIZE | ||
|
||
struct cpu_context { | ||
unsigned long r6; | ||
unsigned long r7; | ||
unsigned long r8; | ||
unsigned long r9; | ||
unsigned long r10; | ||
unsigned long r11; | ||
unsigned long r12; | ||
unsigned long r13; | ||
unsigned long r14; | ||
unsigned long fp; | ||
unsigned long pc; | ||
unsigned long sp; | ||
}; | ||
|
||
struct thread_struct { | ||
struct cpu_context cpu_context; /* cpu context */ | ||
/* fault info */ | ||
unsigned long address; | ||
unsigned long trap_no; | ||
unsigned long error_code; | ||
}; | ||
|
||
#define INIT_THREAD { } | ||
|
||
#ifdef __NDS32_EB__ | ||
#define PSW_DE PSW_mskBE | ||
#else | ||
#define PSW_DE 0x0 | ||
#endif | ||
|
||
#ifdef CONFIG_WBNA | ||
#define PSW_valWBNA PSW_mskWBNA | ||
#else | ||
#define PSW_valWBNA 0x0 | ||
#endif | ||
|
||
#ifdef CONFIG_HWZOL | ||
#define PSW_valINIT (PSW_CPL_ANY | PSW_mskAEN | PSW_valWBNA | PSW_mskDT | PSW_mskIT | PSW_DE | PSW_mskGIE) | ||
#else | ||
#define PSW_valINIT (PSW_CPL_ANY | PSW_valWBNA | PSW_mskDT | PSW_mskIT | PSW_DE | PSW_mskGIE) | ||
#endif | ||
|
||
#define start_thread(regs,pc,stack) \ | ||
({ \ | ||
memzero(regs, sizeof(struct pt_regs)); \ | ||
forget_syscall(regs); \ | ||
regs->ipsw = PSW_valINIT; \ | ||
regs->ir0 = (PSW_CPL_ANY | PSW_valWBNA | PSW_mskDT | PSW_mskIT | PSW_DE | PSW_SYSTEM | PSW_INTL_1); \ | ||
regs->ipc = pc; \ | ||
regs->sp = stack; \ | ||
}) | ||
|
||
/* Forward declaration, a strange C thing */ | ||
struct task_struct; | ||
|
||
/* Free all resources held by a thread. */ | ||
#define release_thread(thread) do { } while(0) | ||
|
||
/* Prepare to copy thread state - unlazy all lazy status */ | ||
#define prepare_to_copy(tsk) do { } while (0) | ||
|
||
unsigned long get_wchan(struct task_struct *p); | ||
|
||
#define cpu_relax() barrier() | ||
|
||
#define task_pt_regs(task) \ | ||
((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \ | ||
- 8) - 1) | ||
|
||
/* | ||
* Create a new kernel thread | ||
*/ | ||
extern int kernel_thread(int (*fn) (void *), void *arg, unsigned long flags); | ||
|
||
#define KSTK_EIP(tsk) instruction_pointer(task_pt_regs(tsk)) | ||
#define KSTK_ESP(tsk) user_stack_pointer(task_pt_regs(tsk)) | ||
|
||
#endif | ||
|
||
#endif /* __ASM_NDS32_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,76 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
// Copyright (C) 2005-2017 Andes Technology Corporation | ||
|
||
#ifndef __ASM_NDS32_THREAD_INFO_H | ||
#define __ASM_NDS32_THREAD_INFO_H | ||
|
||
#ifdef __KERNEL__ | ||
|
||
#define THREAD_SIZE_ORDER (1) | ||
#define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) | ||
|
||
#ifndef __ASSEMBLY__ | ||
|
||
struct task_struct; | ||
|
||
#include <asm/ptrace.h> | ||
#include <asm/types.h> | ||
|
||
typedef unsigned long mm_segment_t; | ||
|
||
/* | ||
* low level task data that entry.S needs immediate access to. | ||
* __switch_to() assumes cpu_context follows immediately after cpu_domain. | ||
*/ | ||
struct thread_info { | ||
unsigned long flags; /* low level flags */ | ||
__s32 preempt_count; /* 0 => preemptable, <0 => bug */ | ||
mm_segment_t addr_limit; /* address limit */ | ||
}; | ||
#define INIT_THREAD_INFO(tsk) \ | ||
{ \ | ||
.preempt_count = INIT_PREEMPT_COUNT, \ | ||
.addr_limit = KERNEL_DS, \ | ||
} | ||
#define thread_saved_pc(tsk) ((unsigned long)(tsk->thread.cpu_context.pc)) | ||
#define thread_saved_fp(tsk) ((unsigned long)(tsk->thread.cpu_context.fp)) | ||
#endif | ||
|
||
/* | ||
* thread information flags: | ||
* TIF_SYSCALL_TRACE - syscall trace active | ||
* TIF_SIGPENDING - signal pending | ||
* TIF_NEED_RESCHED - rescheduling necessary | ||
* TIF_NOTIFY_RESUME - callback before returning to user | ||
* TIF_USEDFPU - FPU was used by this task this quantum (SMP) | ||
* TIF_POLLING_NRFLAG - true if poll_idle() is polling TIF_NEED_RESCHED | ||
*/ | ||
#define TIF_SIGPENDING 1 | ||
#define TIF_NEED_RESCHED 2 | ||
#define TIF_SINGLESTEP 3 | ||
#define TIF_NOTIFY_RESUME 4 /* callback before returning to user */ | ||
#define TIF_SYSCALL_TRACE 8 | ||
#define TIF_USEDFPU 16 | ||
#define TIF_POLLING_NRFLAG 17 | ||
#define TIF_MEMDIE 18 | ||
#define TIF_FREEZE 19 | ||
#define TIF_RESTORE_SIGMASK 20 | ||
|
||
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) | ||
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) | ||
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) | ||
#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) | ||
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) | ||
#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) | ||
#define _TIF_FREEZE (1 << TIF_FREEZE) | ||
#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) | ||
|
||
/* | ||
* Change these and you break ASM code in entry-common.S | ||
*/ | ||
#define _TIF_WORK_MASK 0x000000ff | ||
#define _TIF_WORK_SYSCALL_ENTRY (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP) | ||
#define _TIF_WORK_SYSCALL_LEAVE (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP) | ||
|
||
#endif /* __KERNEL__ */ | ||
#endif /* __ASM_NDS32_THREAD_INFO_H */ |
Oops, something went wrong.