]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/continuation-arm.cpp
update
[l4.git] / kernel / fiasco / src / kern / arm / continuation-arm.cpp
1 INTERFACE[arm]:
2
3 #include "types.h"
4 #include "entry_frame.h"
5 #include "member_offs.h"
6 #include "processor.h"
7
8 class Continuation
9 {
10   MEMBER_OFFSET();
11
12 private:
13   Address _ip;
14   Mword   _psr;
15
16 public:
17   Continuation() : _ip(~0UL) {}
18
19   typedef Return_frame User_return_frame;
20
21   bool valid() const
22   { return _ip != ~0UL; }
23
24   Address ip() const { return _ip; }
25   void ip(Address ip) { _ip = ip; }
26
27   Mword flags(Return_frame const *) const { return _psr; }
28   void flags(Return_frame *, Mword psr) { _psr = psr; }
29
30   Mword sp(Return_frame const *o) const { return o->usp; }
31   void sp(Return_frame *o, Mword sp) { o->usp = sp; }
32
33   void save(Return_frame const *regs)
34   {
35     _ip  = regs->ip();
36     _psr = regs->psr;
37   }
38
39   void activate(Return_frame *regs, void *cont_func)
40   {
41     save(regs);
42     regs->pc = Mword(cont_func);
43     regs->psr &= ~(Proc::Status_mode_mask | Proc::Status_thumb); // clear mode
44     regs->psr |= Proc::Status_mode_supervisor | Proc::Status_interrupts_disabled;
45   }
46
47   void set(Return_frame *dst, User_return_frame const *src)
48   {
49     dst->usp = src->usp;
50     dst->ulr = src->ulr;
51     dst->km_lr = src->km_lr;
52     _ip = src->pc;
53     _psr = src->psr;
54   }
55
56   void get(User_return_frame *dst, Return_frame const *src) const
57   {
58     dst->usp = src->usp;
59     dst->ulr = src->ulr;
60     dst->km_lr = src->km_lr;
61     dst->pc = _ip;
62     dst->psr = _psr;
63   }
64   
65   void clear() { _ip = ~0UL; }
66
67   void restore(Return_frame *regs)
68   {
69     regs->pc = _ip;
70     regs->psr = _psr;
71     clear();
72   }
73
74 };
75