1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * linux/include/asm-arm/proc-armv/processor.h 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 1996-1999 Russell King. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify 7*4882a593Smuzhiyun * it under the terms of the GNU General Public License version 2 as 8*4882a593Smuzhiyun * published by the Free Software Foundation. 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Changelog: 11*4882a593Smuzhiyun * 20-09-1996 RMK Created 12*4882a593Smuzhiyun * 26-09-1996 RMK Added 'EXTRA_THREAD_STRUCT*' 13*4882a593Smuzhiyun * 28-09-1996 RMK Moved start_thread into the processor dependencies 14*4882a593Smuzhiyun * 09-09-1998 PJB Delete redundant `wp_works_ok' 15*4882a593Smuzhiyun * 30-05-1999 PJB Save sl across context switches 16*4882a593Smuzhiyun * 31-07-1999 RMK Added 'domain' stuff 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun #ifndef __ASM_PROC_PROCESSOR_H 19*4882a593Smuzhiyun #define __ASM_PROC_PROCESSOR_H 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #include <asm/proc-armv/domain.h> 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define KERNEL_STACK_SIZE PAGE_SIZE 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun struct context_save_struct { 26*4882a593Smuzhiyun unsigned long cpsr; 27*4882a593Smuzhiyun unsigned long r4; 28*4882a593Smuzhiyun unsigned long r5; 29*4882a593Smuzhiyun unsigned long r6; 30*4882a593Smuzhiyun unsigned long r7; 31*4882a593Smuzhiyun unsigned long r8; 32*4882a593Smuzhiyun unsigned long r9; 33*4882a593Smuzhiyun unsigned long sl; 34*4882a593Smuzhiyun unsigned long fp; 35*4882a593Smuzhiyun unsigned long pc; 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #define INIT_CSS (struct context_save_struct){ SVC_MODE, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define EXTRA_THREAD_STRUCT \ 41*4882a593Smuzhiyun unsigned int domain; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define EXTRA_THREAD_STRUCT_INIT \ 44*4882a593Smuzhiyun domain: domain_val(DOMAIN_USER, DOMAIN_CLIENT) | \ 45*4882a593Smuzhiyun domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \ 46*4882a593Smuzhiyun domain_val(DOMAIN_IO, DOMAIN_CLIENT) 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define start_thread(regs,pc,sp) \ 49*4882a593Smuzhiyun ({ \ 50*4882a593Smuzhiyun unsigned long *stack = (unsigned long *)sp; \ 51*4882a593Smuzhiyun set_fs(USER_DS); \ 52*4882a593Smuzhiyun memzero(regs->uregs, sizeof(regs->uregs)); \ 53*4882a593Smuzhiyun if (current->personality & ADDR_LIMIT_32BIT) \ 54*4882a593Smuzhiyun regs->ARM_cpsr = USR_MODE; \ 55*4882a593Smuzhiyun else \ 56*4882a593Smuzhiyun regs->ARM_cpsr = USR26_MODE; \ 57*4882a593Smuzhiyun regs->ARM_pc = pc; /* pc */ \ 58*4882a593Smuzhiyun regs->ARM_sp = sp; /* sp */ \ 59*4882a593Smuzhiyun regs->ARM_r2 = stack[2]; /* r2 (envp) */ \ 60*4882a593Smuzhiyun regs->ARM_r1 = stack[1]; /* r1 (argv) */ \ 61*4882a593Smuzhiyun regs->ARM_r0 = stack[0]; /* r0 (argc) */ \ 62*4882a593Smuzhiyun }) 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #define KSTK_EIP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1019]) 65*4882a593Smuzhiyun #define KSTK_ESP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1017]) 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* Allocation and freeing of basic task resources. */ 68*4882a593Smuzhiyun /* 69*4882a593Smuzhiyun * NOTE! The task struct and the stack go together 70*4882a593Smuzhiyun */ 71*4882a593Smuzhiyun #define ll_alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1)) 72*4882a593Smuzhiyun #define ll_free_task_struct(p) free_pages((unsigned long)(p),1) 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #endif 75