xref: /OK3568_Linux_fs/kernel/arch/alpha/include/asm/processor.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * include/asm-alpha/processor.h
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 1994 Linus Torvalds
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef __ASM_ALPHA_PROCESSOR_H
9*4882a593Smuzhiyun #define __ASM_ALPHA_PROCESSOR_H
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/personality.h>	/* for ADDR_LIMIT_32BIT */
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun /*
14*4882a593Smuzhiyun  * We have a 42-bit user address space: 4TB user VM...
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun #define TASK_SIZE (0x40000000000UL)
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define STACK_TOP \
19*4882a593Smuzhiyun   (current->personality & ADDR_LIMIT_32BIT ? 0x80000000 : 0x00120000000UL)
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #define STACK_TOP_MAX	0x00120000000UL
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /* This decides where the kernel will search for a free chunk of vm
24*4882a593Smuzhiyun  * space during mmap's.
25*4882a593Smuzhiyun  */
26*4882a593Smuzhiyun #define TASK_UNMAPPED_BASE \
27*4882a593Smuzhiyun   ((current->personality & ADDR_LIMIT_32BIT) ? 0x40000000 : TASK_SIZE / 2)
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun typedef struct {
30*4882a593Smuzhiyun 	unsigned long seg;
31*4882a593Smuzhiyun } mm_segment_t;
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /* This is dead.  Everything has been moved to thread_info.  */
34*4882a593Smuzhiyun struct thread_struct { };
35*4882a593Smuzhiyun #define INIT_THREAD  { }
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun /* Do necessary setup to start up a newly executed thread.  */
38*4882a593Smuzhiyun struct pt_regs;
39*4882a593Smuzhiyun extern void start_thread(struct pt_regs *, unsigned long, unsigned long);
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun /* Free all resources held by a thread. */
42*4882a593Smuzhiyun struct task_struct;
43*4882a593Smuzhiyun extern void release_thread(struct task_struct *);
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun unsigned long get_wchan(struct task_struct *p);
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define KSTK_EIP(tsk) (task_pt_regs(tsk)->pc)
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #define KSTK_ESP(tsk) \
50*4882a593Smuzhiyun   ((tsk) == current ? rdusp() : task_thread_info(tsk)->pcb.usp)
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define cpu_relax()	barrier()
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun #define ARCH_HAS_PREFETCH
55*4882a593Smuzhiyun #define ARCH_HAS_PREFETCHW
56*4882a593Smuzhiyun #define ARCH_HAS_SPINLOCK_PREFETCH
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #ifndef CONFIG_SMP
59*4882a593Smuzhiyun /* Nothing to prefetch. */
60*4882a593Smuzhiyun #define spin_lock_prefetch(lock)  	do { } while (0)
61*4882a593Smuzhiyun #endif
62*4882a593Smuzhiyun 
prefetch(const void * ptr)63*4882a593Smuzhiyun extern inline void prefetch(const void *ptr)
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun 	__builtin_prefetch(ptr, 0, 3);
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun 
prefetchw(const void * ptr)68*4882a593Smuzhiyun extern inline void prefetchw(const void *ptr)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun 	__builtin_prefetch(ptr, 1, 3);
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #ifdef CONFIG_SMP
spin_lock_prefetch(const void * ptr)74*4882a593Smuzhiyun extern inline void spin_lock_prefetch(const void *ptr)
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun 	__builtin_prefetch(ptr, 1, 3);
77*4882a593Smuzhiyun }
78*4882a593Smuzhiyun #endif
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun #endif /* __ASM_ALPHA_PROCESSOR_H */
81