xref: /rk3399_rockchip-uboot/arch/arm/include/asm/proc-armv/processor.h (revision dab5e3469d294a4e1ffed8407d296a78e02cc01f)
1819833afSPeter Tyser /*
2819833afSPeter Tyser  *  linux/include/asm-arm/proc-armv/processor.h
3819833afSPeter Tyser  *
4819833afSPeter Tyser  *  Copyright (C) 1996-1999 Russell King.
5819833afSPeter Tyser  *
6819833afSPeter Tyser  * This program is free software; you can redistribute it and/or modify
7819833afSPeter Tyser  * it under the terms of the GNU General Public License version 2 as
8819833afSPeter Tyser  * published by the Free Software Foundation.
9819833afSPeter Tyser  *
10819833afSPeter Tyser  *  Changelog:
11819833afSPeter Tyser  *   20-09-1996	RMK	Created
12819833afSPeter Tyser  *   26-09-1996	RMK	Added 'EXTRA_THREAD_STRUCT*'
13819833afSPeter Tyser  *   28-09-1996	RMK	Moved start_thread into the processor dependencies
14819833afSPeter Tyser  *   09-09-1998	PJB	Delete redundant `wp_works_ok'
15819833afSPeter Tyser  *   30-05-1999	PJB	Save sl across context switches
16819833afSPeter Tyser  *   31-07-1999	RMK	Added 'domain' stuff
17819833afSPeter Tyser  */
18819833afSPeter Tyser #ifndef __ASM_PROC_PROCESSOR_H
19819833afSPeter Tyser #define __ASM_PROC_PROCESSOR_H
20819833afSPeter Tyser 
21*7d89982bSVasili Galka #include <asm/proc-armv/domain.h>
22819833afSPeter Tyser 
23819833afSPeter Tyser #define KERNEL_STACK_SIZE	PAGE_SIZE
24819833afSPeter Tyser 
25819833afSPeter Tyser struct context_save_struct {
26819833afSPeter Tyser 	unsigned long cpsr;
27819833afSPeter Tyser 	unsigned long r4;
28819833afSPeter Tyser 	unsigned long r5;
29819833afSPeter Tyser 	unsigned long r6;
30819833afSPeter Tyser 	unsigned long r7;
31819833afSPeter Tyser 	unsigned long r8;
32819833afSPeter Tyser 	unsigned long r9;
33819833afSPeter Tyser 	unsigned long sl;
34819833afSPeter Tyser 	unsigned long fp;
35819833afSPeter Tyser 	unsigned long pc;
36819833afSPeter Tyser };
37819833afSPeter Tyser 
38819833afSPeter Tyser #define INIT_CSS (struct context_save_struct){ SVC_MODE, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
39819833afSPeter Tyser 
40819833afSPeter Tyser #define EXTRA_THREAD_STRUCT						\
41819833afSPeter Tyser 	unsigned int	domain;
42819833afSPeter Tyser 
43819833afSPeter Tyser #define EXTRA_THREAD_STRUCT_INIT					\
44819833afSPeter Tyser 	domain:	  domain_val(DOMAIN_USER, DOMAIN_CLIENT) |		\
45819833afSPeter Tyser 		  domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) |		\
46819833afSPeter Tyser 		  domain_val(DOMAIN_IO, DOMAIN_CLIENT)
47819833afSPeter Tyser 
48819833afSPeter Tyser #define start_thread(regs,pc,sp)					\
49819833afSPeter Tyser ({									\
50819833afSPeter Tyser 	unsigned long *stack = (unsigned long *)sp;			\
51819833afSPeter Tyser 	set_fs(USER_DS);						\
52819833afSPeter Tyser 	memzero(regs->uregs, sizeof(regs->uregs));			\
53819833afSPeter Tyser 	if (current->personality & ADDR_LIMIT_32BIT)			\
54819833afSPeter Tyser 		regs->ARM_cpsr = USR_MODE;				\
55819833afSPeter Tyser 	else								\
56819833afSPeter Tyser 		regs->ARM_cpsr = USR26_MODE;				\
57819833afSPeter Tyser 	regs->ARM_pc = pc;		/* pc */			\
58819833afSPeter Tyser 	regs->ARM_sp = sp;		/* sp */			\
59819833afSPeter Tyser 	regs->ARM_r2 = stack[2];	/* r2 (envp) */			\
60819833afSPeter Tyser 	regs->ARM_r1 = stack[1];	/* r1 (argv) */			\
61819833afSPeter Tyser 	regs->ARM_r0 = stack[0];	/* r0 (argc) */			\
62819833afSPeter Tyser })
63819833afSPeter Tyser 
64819833afSPeter Tyser #define KSTK_EIP(tsk)	(((unsigned long *)(4096+(unsigned long)(tsk)))[1019])
65819833afSPeter Tyser #define KSTK_ESP(tsk)	(((unsigned long *)(4096+(unsigned long)(tsk)))[1017])
66819833afSPeter Tyser 
67819833afSPeter Tyser /* Allocation and freeing of basic task resources. */
68819833afSPeter Tyser /*
69819833afSPeter Tyser  * NOTE! The task struct and the stack go together
70819833afSPeter Tyser  */
71819833afSPeter Tyser #define ll_alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1))
72819833afSPeter Tyser #define ll_free_task_struct(p) free_pages((unsigned long)(p),1)
73819833afSPeter Tyser 
74819833afSPeter Tyser #endif
75