]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ppc32/entry_frame-ppc32.cpp
Update
[l4.git] / kernel / fiasco / src / kern / ppc32 / entry_frame-ppc32.cpp
1 INTERFACE[ppc32]:
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 [ppc32]:
31
32 #include "warn.h"
33 #include "msr.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 ["msr.h"]
103 bool
104 Return_frame::user_mode()
105 {
106   return Msr::Msr_pr & srr1;
107 }
108
109 //---------------------------------------------------------------------------
110 //TODO cbass: set registers properly 
111 IMPLEMENT inline
112 void Syscall_frame::from(Mword id)
113 { r[5] = id; /*r6*/ }
114
115 IMPLEMENT inline
116 Mword Syscall_frame::from_spec() const
117 { return r[5]; /*r6*/ }
118
119
120 IMPLEMENT inline
121 L4_obj_ref Syscall_frame::ref() const
122 { return L4_obj_ref::from_raw(r[3]); /*r4*/ }
123
124 IMPLEMENT inline
125 void Syscall_frame::ref(L4_obj_ref const &ref)
126 { r[3] = ref.raw(); /*r4*/ }
127
128 IMPLEMENT inline
129 L4_timeout_pair Syscall_frame::timeout() const
130 { return L4_timeout_pair(r[4]); /*r5*/ }
131
132 IMPLEMENT inline 
133 void Syscall_frame::timeout(L4_timeout_pair const &to)
134 { r[4] = to.raw(); /*r5*/ }
135
136 IMPLEMENT inline Utcb *Syscall_frame::utcb() const
137 { return reinterpret_cast<Utcb*>(r[1]); /*r2*/}
138
139 IMPLEMENT inline L4_msg_tag Syscall_frame::tag() const
140 { return L4_msg_tag(r[2]); /*r3*/ }
141
142 IMPLEMENT inline
143 void Syscall_frame::tag(L4_msg_tag const &tag)
144 { r[2] = tag.raw(); /*r3*/ }
145