OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [include/] [asm-m68k/] [processor.h] - Blame information for rev 1276

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1276 phoenix
/*
2
 * include/asm-m68k/processor.h
3
 *
4
 * Copyright (C) 1995 Hamish Macdonald
5
 */
6
 
7
#ifndef __ASM_M68K_PROCESSOR_H
8
#define __ASM_M68K_PROCESSOR_H
9
 
10
/*
11
 * Default implementation of macro that returns current
12
 * instruction pointer ("program counter").
13
 */
14
#define current_text_addr() ({ __label__ _l; _l: &&_l;})
15
 
16
#include <linux/config.h>
17
#include <asm/segment.h>
18
#include <asm/fpu.h>
19
#include <asm/ptrace.h>
20
 
21
static inline unsigned long rdusp(void)
22
{
23
        unsigned long usp;
24
 
25
        __asm__ __volatile__("move %/usp,%0" : "=a" (usp));
26
        return usp;
27
}
28
 
29
static inline void wrusp(unsigned long usp)
30
{
31
        __asm__ __volatile__("move %0,%/usp" : : "a" (usp));
32
}
33
 
34
/*
35
 * User space process size: 3.75GB. This is hardcoded into a few places,
36
 * so don't change it unless you know what you are doing.
37
 */
38
#ifndef CONFIG_SUN3
39
#define TASK_SIZE       (0xF0000000UL)
40
#else
41
#ifdef __ASSEMBLY__
42
#define TASK_SIZE       (0x0E000000)
43
#else
44
#define TASK_SIZE       (0x0E000000UL)
45
#endif
46
#endif
47
 
48
/* This decides where the kernel will search for a free chunk of vm
49
 * space during mmap's.
50
 */
51
#ifndef CONFIG_SUN3
52
#define TASK_UNMAPPED_BASE      0xC0000000UL
53
#else
54
#define TASK_UNMAPPED_BASE      0x0A000000UL
55
#endif
56
#define TASK_UNMAPPED_ALIGN(addr, off)  PAGE_ALIGN(addr)
57
 
58
/*
59
 * Bus types
60
 */
61
#define EISA_bus 0
62
#define MCA_bus 0
63
 
64
/*
65
 * if you change this structure, you must change the code and offsets
66
 * in m68k/machasm.S
67
 */
68
 
69
struct thread_struct {
70
        unsigned long  ksp;             /* kernel stack pointer */
71
        unsigned long  usp;             /* user stack pointer */
72
        unsigned short sr;              /* saved status register */
73
        unsigned short fs;              /* saved fs (sfc, dfc) */
74
        unsigned long  crp[2];          /* cpu root pointer */
75
        unsigned long  esp0;            /* points to SR of stack frame */
76
        unsigned long  faddr;           /* info about last fault */
77
        int            signo, code;
78
        unsigned long  fp[8*3];
79
        unsigned long  fpcntl[3];       /* fp control regs */
80
        unsigned char  fpstate[FPSTATESIZE];  /* floating point state */
81
};
82
 
83
#define INIT_THREAD  { \
84
        sizeof(init_stack) + (unsigned long) init_stack, 0, \
85
        PS_S, __KERNEL_DS, \
86
}
87
 
88
/*
89
 * Do necessary setup to start up a newly executed thread.
90
 */
91
static inline void start_thread(struct pt_regs * regs, unsigned long pc,
92
                                unsigned long usp)
93
{
94
        /* reads from user space */
95
        set_fs(USER_DS);
96
 
97
        regs->pc = pc;
98
        regs->sr &= ~0x2000;
99
        wrusp(usp);
100
}
101
 
102
/* Forward declaration, a strange C thing */
103
struct task_struct;
104
 
105
/* Free all resources held by a thread. */
106
static inline void release_thread(struct task_struct *dead_task)
107
{
108
}
109
 
110
extern int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
111
 
112
#define copy_segments(tsk, mm)          do { } while (0)
113
#define release_segments(mm)            do { } while (0)
114
 
115
/*
116
 * Free current thread data structures etc..
117
 */
118
static inline void exit_thread(void)
119
{
120
}
121
 
122
/*
123
 * Return saved PC of a blocked thread.
124
 */
125
static inline unsigned long thread_saved_pc(struct thread_struct *t)
126
{
127
        extern void scheduling_functions_start_here(void);
128
        extern void scheduling_functions_end_here(void);
129
        struct switch_stack *sw = (struct switch_stack *)t->ksp;
130
        /* Check whether the thread is blocked in resume() */
131
        if (sw->retpc > (unsigned long)scheduling_functions_start_here &&
132
            sw->retpc < (unsigned long)scheduling_functions_end_here)
133
                return ((unsigned long *)sw->a6)[1];
134
        else
135
                return sw->retpc;
136
}
137
 
138
unsigned long get_wchan(struct task_struct *p);
139
 
140
#define KSTK_EIP(tsk)   \
141
    ({                  \
142
        unsigned long eip = 0;    \
143
        if ((tsk)->thread.esp0 > PAGE_SIZE && \
144
            (VALID_PAGE(virt_to_page((tsk)->thread.esp0)))) \
145
              eip = ((struct pt_regs *) (tsk)->thread.esp0)->pc; \
146
        eip; })
147
#define KSTK_ESP(tsk)   ((tsk) == current ? rdusp() : (tsk)->thread.usp)
148
 
149
#define THREAD_SIZE (2*PAGE_SIZE)
150
 
151
/* Allocation and freeing of basic task resources. */
152
#define alloc_task_struct() \
153
        ((struct task_struct *) __get_free_pages(GFP_KERNEL,1))
154
#define free_task_struct(p)     free_pages((unsigned long)(p),1)
155
#define get_task_struct(tsk)      atomic_inc(&virt_to_page(tsk)->count)
156
 
157
#define init_task       (init_task_union.task)
158
#define init_stack      (init_task_union.stack)
159
 
160
#define cpu_relax()     barrier()
161
 
162
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.