1*58e0166aSJonas Bonn /* 2*58e0166aSJonas Bonn * OpenRISC Linux 3*58e0166aSJonas Bonn * 4*58e0166aSJonas Bonn * Linux architectural port borrowing liberally from similar works of 5*58e0166aSJonas Bonn * others. All original copyrights apply as per the original source 6*58e0166aSJonas Bonn * declaration. 7*58e0166aSJonas Bonn * 8*58e0166aSJonas Bonn * OpenRISC implementation: 9*58e0166aSJonas Bonn * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com> 10*58e0166aSJonas Bonn * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se> 11*58e0166aSJonas Bonn * et al. 12*58e0166aSJonas Bonn * 13*58e0166aSJonas Bonn * This program is free software; you can redistribute it and/or modify 14*58e0166aSJonas Bonn * it under the terms of the GNU General Public License as published by 15*58e0166aSJonas Bonn * the Free Software Foundation; either version 2 of the License, or 16*58e0166aSJonas Bonn * (at your option) any later version. 17*58e0166aSJonas Bonn */ 18*58e0166aSJonas Bonn 19*58e0166aSJonas Bonn #ifndef __ASM_OPENRISC_PROCESSOR_H 20*58e0166aSJonas Bonn #define __ASM_OPENRISC_PROCESSOR_H 21*58e0166aSJonas Bonn 22*58e0166aSJonas Bonn #include <asm/spr_defs.h> 23*58e0166aSJonas Bonn #include <asm/page.h> 24*58e0166aSJonas Bonn #include <asm/ptrace.h> 25*58e0166aSJonas Bonn 26*58e0166aSJonas Bonn #define STACK_TOP TASK_SIZE 27*58e0166aSJonas Bonn #define STACK_TOP_MAX STACK_TOP 28*58e0166aSJonas Bonn /* Kernel and user SR register setting */ 29*58e0166aSJonas Bonn #define KERNEL_SR (SPR_SR_DME | SPR_SR_IME | SPR_SR_ICE \ 30*58e0166aSJonas Bonn | SPR_SR_DCE | SPR_SR_SM) 31*58e0166aSJonas Bonn #define USER_SR (SPR_SR_DME | SPR_SR_IME | SPR_SR_ICE \ 32*58e0166aSJonas Bonn | SPR_SR_DCE | SPR_SR_IEE | SPR_SR_TEE) 33*58e0166aSJonas Bonn /* 34*58e0166aSJonas Bonn * Default implementation of macro that returns current 35*58e0166aSJonas Bonn * instruction pointer ("program counter"). 36*58e0166aSJonas Bonn */ 37*58e0166aSJonas Bonn #define current_text_addr() ({ __label__ _l; _l: &&_l; }) 38*58e0166aSJonas Bonn 39*58e0166aSJonas Bonn /* 40*58e0166aSJonas Bonn * User space process size. This is hardcoded into a few places, 41*58e0166aSJonas Bonn * so don't change it unless you know what you are doing. 42*58e0166aSJonas Bonn */ 43*58e0166aSJonas Bonn 44*58e0166aSJonas Bonn #define TASK_SIZE (0x80000000UL) 45*58e0166aSJonas Bonn 46*58e0166aSJonas Bonn /* This decides where the kernel will search for a free chunk of vm 47*58e0166aSJonas Bonn * space during mmap's. 48*58e0166aSJonas Bonn */ 49*58e0166aSJonas Bonn #define TASK_UNMAPPED_BASE (TASK_SIZE / 8 * 3) 50*58e0166aSJonas Bonn 51*58e0166aSJonas Bonn #ifndef __ASSEMBLY__ 52*58e0166aSJonas Bonn 53*58e0166aSJonas Bonn struct task_struct; 54*58e0166aSJonas Bonn 55*58e0166aSJonas Bonn struct thread_struct { 56*58e0166aSJonas Bonn }; 57*58e0166aSJonas Bonn 58*58e0166aSJonas Bonn /* 59*58e0166aSJonas Bonn * At user->kernel entry, the pt_regs struct is stacked on the top of the 60*58e0166aSJonas Bonn * kernel-stack. This macro allows us to find those regs for a task. 61*58e0166aSJonas Bonn * Notice that subsequent pt_regs stackings, like recursive interrupts 62*58e0166aSJonas Bonn * occurring while we're in the kernel, won't affect this - only the first 63*58e0166aSJonas Bonn * user->kernel transition registers are reached by this (i.e. not regs 64*58e0166aSJonas Bonn * for running signal handler) 65*58e0166aSJonas Bonn */ 66*58e0166aSJonas Bonn #define user_regs(thread_info) (((struct pt_regs *)((unsigned long)(thread_info) + THREAD_SIZE - STACK_FRAME_OVERHEAD)) - 1) 67*58e0166aSJonas Bonn 68*58e0166aSJonas Bonn /* 69*58e0166aSJonas Bonn * Dito but for the currently running task 70*58e0166aSJonas Bonn */ 71*58e0166aSJonas Bonn 72*58e0166aSJonas Bonn #define task_pt_regs(task) user_regs(task_thread_info(task)) 73*58e0166aSJonas Bonn #define current_regs() user_regs(current_thread_info()) 74*58e0166aSJonas Bonn 75*58e0166aSJonas Bonn extern inline void prepare_to_copy(struct task_struct *tsk) 76*58e0166aSJonas Bonn { 77*58e0166aSJonas Bonn } 78*58e0166aSJonas Bonn 79*58e0166aSJonas Bonn #define INIT_SP (sizeof(init_stack) + (unsigned long) &init_stack) 80*58e0166aSJonas Bonn 81*58e0166aSJonas Bonn #define INIT_THREAD { } 82*58e0166aSJonas Bonn 83*58e0166aSJonas Bonn 84*58e0166aSJonas Bonn #define KSTK_EIP(tsk) (task_pt_regs(tsk)->pc); 85*58e0166aSJonas Bonn #define KSTK_ESP(tsk) (task_pt_regs(tsk)->sp); 86*58e0166aSJonas Bonn 87*58e0166aSJonas Bonn 88*58e0166aSJonas Bonn extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); 89*58e0166aSJonas Bonn 90*58e0166aSJonas Bonn void start_thread(struct pt_regs *regs, unsigned long nip, unsigned long sp); 91*58e0166aSJonas Bonn void release_thread(struct task_struct *); 92*58e0166aSJonas Bonn unsigned long get_wchan(struct task_struct *p); 93*58e0166aSJonas Bonn 94*58e0166aSJonas Bonn /* 95*58e0166aSJonas Bonn * Free current thread data structures etc.. 96*58e0166aSJonas Bonn */ 97*58e0166aSJonas Bonn 98*58e0166aSJonas Bonn extern inline void exit_thread(void) 99*58e0166aSJonas Bonn { 100*58e0166aSJonas Bonn /* Nothing needs to be done. */ 101*58e0166aSJonas Bonn } 102*58e0166aSJonas Bonn 103*58e0166aSJonas Bonn /* 104*58e0166aSJonas Bonn * Return saved PC of a blocked thread. For now, this is the "user" PC 105*58e0166aSJonas Bonn */ 106*58e0166aSJonas Bonn extern unsigned long thread_saved_pc(struct task_struct *t); 107*58e0166aSJonas Bonn 108*58e0166aSJonas Bonn #define init_stack (init_thread_union.stack) 109*58e0166aSJonas Bonn 110*58e0166aSJonas Bonn #define cpu_relax() do { } while (0) 111*58e0166aSJonas Bonn 112*58e0166aSJonas Bonn #endif /* __ASSEMBLY__ */ 113*58e0166aSJonas Bonn #endif /* __ASM_OPENRISC_PROCESSOR_H */ 114