]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/kern_lib_page.cpp
update
[l4.git] / kernel / fiasco / src / kern / arm / kern_lib_page.cpp
1 INTERFACE [arm]:
2
3 class Kern_lib_page
4 {
5 public:
6   static void init();
7 };
8
9
10 //---------------------------------------------------------------------------
11 IMPLEMENTATION [arm]:
12
13 #include <panic.h>
14
15 #include "kmem_space.h"
16 #include "pagetable.h"
17 #include "ram_quota.h"
18
19 IMPLEMENT
20 void Kern_lib_page::init()
21 {
22   extern char kern_lib_start;
23
24   Pte pte = Kmem_space::kdir()->walk((void*)Kmem_space::Kern_lib_base, 
25       Config::PAGE_SIZE, true, Ram_quota::root);
26
27   if (pte.lvl() == 0) // allocation of second level faild
28     {
29       panic("FATAL: Error mapping cpu page to %p\n",
30             (void*)Kmem_space::Kern_lib_base);
31     }
32   
33   pte.set((Address)&kern_lib_start - Mem_layout::Map_base 
34       + Mem_layout::Sdram_phys_base,
35       Config::PAGE_SIZE, Mem_page_attr(Page::USER_RO | Page::CACHEABLE), true);
36
37 }
38
39 //---------------------------------------------------------------------------
40 IMPLEMENTATION [arm && !armv6plus]:
41
42 asm (
43     ".p2align(12)                        \n"
44     "kern_lib_start:                     \n"
45
46     // atomic add
47     // r0: memory reference
48     // r1: delta value
49     "  ldr r2, [r0]                      \n"
50     "  add r2, r2, r1                    \n"
51     "  nop                               \n"
52     "  str r2, [r0]                      \n"
53     // forward point
54     "  mov r0, r2                        \n"
55     "  mov pc, lr                        \n"
56     // return: always succeeds, new value
57
58     // compare exchange
59     // r0: memory reference
60     // r1: cmp value
61     // r2: new value
62     ".p2align(8)                         \n"
63     "  ldr r3, [r0]                      \n"
64     "  cmp r3, r1                        \n"
65     "  nop                               \n"
66     "  streq r2, [r0]                    \n"
67     // forward point
68     "  moveq r0, #1                      \n"
69     "  movne r0, #0                      \n"
70     "  mov pc, lr                        \n"
71     // return result: 1 success, 0 failure
72
73     // exchange
74     //  in-r0: memory reference
75     //  in-r1: new value
76     // out-r0: old value
77     ".p2align(8)                         \n"
78     "  ldr r2, [r0]                      \n"
79     "  nop                               \n"
80     "  nop                               \n"
81     "  str r1, [r0]                      \n"
82     // forward point
83     "  mov r0, r2                        \n"
84     "  mov pc, lr                        \n"
85     // return: always succeeds, old value
86     );
87
88 //---------------------------------------------------------------------------
89 IMPLEMENTATION [arm && armv6plus]:
90
91 asm (
92     ".p2align(12)                        \n"
93     "kern_lib_start:                     \n"
94
95     // no restart through kernel entry code
96
97     // atomic add
98     // r0: memory reference
99     // r1: delta value
100     // r2: temp register
101     // r3: temp register
102     " 1:                                 \n"
103     " ldrex r2, [r0]                     \n"
104     " add   r2, r2, r1                   \n"
105     " strex r3, r2, [r0]                 \n"
106     " teq r3, #0                         \n"
107     " bne 1b                             \n"
108     " mov r0, r2                         \n"
109     " mov pc, lr                         \n"
110     // return: always succeeds, new value
111
112
113     // compare exchange
114     // r0: memory reference
115     // r1: cmp value
116     // r2: new value
117     // r3: tmp reg
118     ".p2align(8)                         \n"
119     "  ldrex r3, [r0]                    \n"
120     "  cmp r3, r1                        \n"
121     "  strexeq r3, r2, [r0]              \n"
122     "  teqeq r3, #0                      \n"
123     "  moveq r0, #1                      \n"
124     "  movne r0, #0                      \n"
125     "  mov pc, lr                        \n"
126     // return result: 1 success, 0 failure
127
128
129     // exchange
130     //  in-r0: memory reference
131     //  in-r1: new value
132     // out-r0: old value
133     ".p2align(8)                         \n"
134     "  1:                                \n"
135     "  ldrex r2, [r0]                    \n"
136     "  strex r3, r1, [r0]                \n"
137     "  cmp r3, #0                        \n"
138     "  bne 1b                            \n"
139     "  mov r0, r2                        \n"
140     "  mov pc, lr                        \n"
141     // return: always succeeds, old value
142     );