]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/sparc/entry_frame-sparc.cpp
update
[l4.git] / kernel / fiasco / src / kern / sparc / entry_frame-sparc.cpp
1 INTERFACE[sparc]:
2
3 #include "types.h"
4
5 EXTENSION class Syscall_frame
6 {
7   public:
8     Mword r[30]; //{r0, r2, r3, ..., r10, r13 .., r31, ip
9     void dump() const;
10 };
11
12 EXTENSION class Return_frame
13 {
14   public:
15     Mword xer;  //+32
16     Mword ctr;  //+28
17     Mword cr;   //+24
18     Mword srr1; //+20
19     Mword srr0; //+16
20     Mword ulr;  //+12
21     Mword usp;  //+8
22     Mword r11;  //+4 --two scratch registers for exception entry
23     Mword r12;  //0
24     void dump();
25     void dump_scratch();
26     bool user_mode();
27 };
28
29 //------------------------------------------------------------------------------
30 IMPLEMENTATION [sparc]:
31
32 #include "warn.h"
33 #include "psr.h"
34
35 IMPLEMENT
36 void
37 Syscall_frame::dump() const
38 {
39   printf("IP: %08lx\n", r[29]);
40   printf("R[%2d]: %08lx R[%2d]: %08lx R[%2d]: %08lx R[%2d]: %08lx R[%2d]: %08lx\n",
41           0, r[0], 2, r[1], 3, r[2], 4, r[3], 5, r[4]);
42   printf("R[%2d]: %08lx R[%2d]: %08lx R[%2d]: %08lx R[%2d]: %08lx R[%2d]: %08lx\n",
43           6, r[5], 7, r[6], 8, r[7], 9, r[8], 10, r[9]);
44 }
45
46 PRIVATE
47 void
48 Return_frame::srr1_bit_scan()
49 {
50   printf("SRR1 bits:");
51   for(int i = 31; i >= 0; i--)
52     if(srr1 & (1 << i))
53      printf(" %d", 31-i);
54   printf("\n");
55 }
56
57 IMPLEMENT
58 void
59 Return_frame::dump()
60 {
61   printf("SRR0 %08lx SRR1 %08lx SP %08lx\n"
62          "LR   %08lx CTR  %08lx CR %08lx XER %08lx\n",
63          srr0, srr1, usp, ulr, ctr, cr, xer);
64   srr1_bit_scan();
65 }
66
67 IMPLEMENT
68 void
69 Return_frame::dump_scratch()
70 {
71   printf("\nR[%2d]: %08lx\nR[%2d]: %08lx\n", 11, r11, 12, r12);
72 }
73
74 IMPLEMENT inline
75 Mword
76 Return_frame::sp() const
77 {
78   return Return_frame::usp;
79 }
80
81 IMPLEMENT inline
82 void
83 Return_frame::sp(Mword _sp)
84 {
85   Return_frame::usp = _sp;
86 }
87
88 IMPLEMENT inline
89 Mword
90 Return_frame::ip() const
91 {
92   return Return_frame::srr0;
93 }
94
95 IMPLEMENT inline
96 void
97 Return_frame::ip(Mword _pc)
98 {
99   Return_frame::srr0 = _pc;
100 }
101
102 IMPLEMENT inline NEEDS ["psr.h"]
103 bool
104 Return_frame::user_mode()
105 {
106   return 0;
107   /*return Msr::Msr_pr & srr1;*/
108 }
109
110 //---------------------------------------------------------------------------
111 //TODO cbass: set registers properly 
112 IMPLEMENT inline
113 Mword Syscall_frame::next_period() const
114 { return false; }
115
116 IMPLEMENT inline
117 void Syscall_frame::from(Mword id)
118 { r[5] = id; /*r6*/ }
119
120 IMPLEMENT inline
121 Mword Syscall_frame::from_spec() const
122 { return r[5]; /*r6*/ }
123
124
125 IMPLEMENT inline
126 L4_obj_ref Syscall_frame::ref() const
127 { return L4_obj_ref::from_raw(r[3]); /*r4*/ }
128
129 IMPLEMENT inline
130 void Syscall_frame::ref(L4_obj_ref const &ref)
131 { r[3] = ref.raw(); /*r4*/ }
132
133 IMPLEMENT inline
134 L4_timeout_pair Syscall_frame::timeout() const
135 { return L4_timeout_pair(r[4]); /*r5*/ }
136
137 IMPLEMENT inline 
138 void Syscall_frame::timeout(L4_timeout_pair const &to)
139 { r[4] = to.raw(); /*r5*/ }
140
141 IMPLEMENT inline Utcb *Syscall_frame::utcb() const
142 { return reinterpret_cast<Utcb*>(r[1]); /*r2*/}
143
144 IMPLEMENT inline L4_msg_tag Syscall_frame::tag() const
145 { return L4_msg_tag(r[2]); /*r3*/ }
146
147 IMPLEMENT inline
148 void Syscall_frame::tag(L4_msg_tag const &tag)
149 { r[2] = tag.raw(); /*r3*/ }
150