This source file includes following definitions.
- xchg_u32
- xchg_ptr
1 #ifndef __SPARC_SYSTEM_H
2 #define __SPARC_SYSTEM_H
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include <asm/openprom.h>
21
22 #define INIT_PCB 0x00011fe0
23 #define INIT_STACK 0x00013fe0
24 #define START_ADDR 0x00004000
25 #define START_SIZE (32*1024)
26
27 #ifndef __ASSEMBLY__
28
29 extern void wrent(void *, unsigned long);
30 extern void wrkgp(unsigned long);
31 extern struct linux_romvec *romvec;
32
33 #define halt() { romvec->pv_halt(); }
34 #define move_to_user_mode() halt()
35 #define switch_to(x) halt()
36
37 #ifndef stbar
38 #define stbar() __asm__ __volatile__("stbar": : :"memory")
39 #endif
40
41
42
43
44
45 #define swpipl(__new_ipl) \
46 ({ unsigned long __old_ipl, psr; \
47 __asm__ __volatile__( \
48 "and %1, 15, %1\n\t" \
49 "sll %1, 8, %1\n\t" \
50 "rd %%psr, %2\n\t" \
51 "or %%g0, %2, %0\n\t" \
52 "or %2, %1, %2\n\t" \
53 "wr %2, 0x0, %%psr\n\t" \
54 "srl %0, 8, %0\n\t" \
55 "and %0, 15, %0\n\t" \
56 : "=r" (__old_ipl) \
57 : "r" (__new_ipl), "r" (psr=0)); \
58 __old_ipl; })
59
60 #define cli() swpipl(15)
61 #define sti() swpipl(0)
62 #define save_flags(flags) do { flags = swpipl(15); } while (0)
63 #define restore_flags(flags) swpipl(flags)
64
65 #define iret() __asm__ __volatile__ ("jmp %%l1\n\t" \
66 "rett %l2\n\t": : :"memory")
67
68 #define _set_gate(gate_addr,type,dpl,addr) \
69 __asm__ __volatile__ ("nop\n\t")
70
71 #define set_intr_gate(n,addr) \
72 _set_gate(&idt[n],14,0,addr)
73
74 #define set_trap_gate(n,addr) \
75 _set_gate(&idt[n],15,0,addr)
76
77 #define set_system_gate(n,addr) \
78 _set_gate(&idt[n],15,3,addr)
79
80 #define set_call_gate(a,addr) \
81 _set_gate(a,12,3,addr)
82
83
84
85
86 extern inline void *xchg_u32(int * m, unsigned long val)
87 {
88 unsigned long dummy;
89
90 __asm__ __volatile__(
91 "ld [%1],%2\n\t"
92 "st %0, [%1]\n\t"
93 "or %%g0, %2, %0"
94 : "=r" (val), "=r" (m), "=r" (dummy)
95 : "0" (val));
96 return (void *)val;
97 }
98
99
100
101
102
103
104 extern inline void *xchg_ptr(void *m, void *val)
105 {
106 return (void *) xchg_u32((int *) m, (unsigned long) val);
107 }
108
109
110
111 #endif
112
113 #endif