]> 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_alloc.h"
16 #include "kmem_space.h"
17 #include "ram_quota.h"
18 #include "paging.h"
19
20 IMPLEMENT
21 void Kern_lib_page::init()
22 {
23   extern char kern_lib_start;
24   auto pte = Kmem_space::kdir()->walk(Virt_addr(Kmem_space::Kern_lib_base),
25       Pdir::Depth, true,
26       Kmem_alloc::q_allocator(Ram_quota::root));
27
28   if (pte.level == 0) // allocation of second level faild
29     panic("FATAL: Error mapping kernel-lib page to %p\n",
30           (void *)Kmem_space::Kern_lib_base);
31
32   pte.create_page(Phys_mem_addr((Address)&kern_lib_start - Mem_layout::Map_base
33           + Mem_layout::Sdram_phys_base), Page::Attr(Page::Rights::URX(), Page::Type::Normal(), Page::Kern::Global()));
34   pte.write_back_if(true, Mem_unit::Asid_kernel);
35 }
36
37 //---------------------------------------------------------------------------
38 IMPLEMENTATION [arm && !armv6plus]:
39
40 asm (
41     ".p2align(12)                        \n"
42     "kern_lib_start:                     \n"
43
44     // atomic add
45     // r0: memory reference
46     // r1: delta value
47     "  ldr r2, [r0]                      \n"
48     "  add r2, r2, r1                    \n"
49     "  nop                               \n"
50     "  str r2, [r0]                      \n"
51     // forward point
52     "  mov r0, r2                        \n"
53     "  mov pc, lr                        \n"
54     // return: always succeeds, new value
55
56     // compare exchange
57     // r0: memory reference
58     // r1: cmp value
59     // r2: new value
60     // r3: tmp
61     ".p2align(8)                         \n"
62     "  ldr r3, [r0]                      \n"
63     "  cmp r3, r1                        \n"
64     "  nop                               \n"
65     "  streq r2, [r0]                    \n"
66     // forward point
67     "  moveq r0, #1                      \n"
68     "  movne r0, #0                      \n"
69     "  mov pc, lr                        \n"
70     // return result: 1 success, 0 failure
71
72     // exchange
73     //  in-r0: memory reference
74     //  in-r1: new value
75     // out-r0: old value
76     // tmp-r2
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     ".global kern_lib_start              \n" // need this for mem_space.cpp
94     "kern_lib_start:                     \n"
95
96     // no restart through kernel entry code
97
98     // atomic add
99     // r0: memory reference
100     // r1: delta value
101     // r2: temp register
102     // r3: temp register
103     " 1:                                 \n"
104     " ldrex r2, [r0]                     \n"
105     " add   r2, r2, r1                   \n"
106     " strex r3, r2, [r0]                 \n"
107     " teq r3, #0                         \n"
108     " bne 1b                             \n"
109     " mov r0, r2                         \n"
110     " mov pc, lr                         \n"
111     // return: always succeeds, new value
112
113
114     // compare exchange
115     // r0: memory reference
116     // r1: cmp value
117     // r2: new value
118     // r3: tmp reg
119     ".p2align(8)                         \n"
120     "  1: ldrex r3, [r0]                 \n"
121     "  cmp r3, r1                        \n"
122     "  movne r0, #0                      \n"
123     "  movne pc, lr                      \n"
124     "  strex r3, r2, [r0]                \n"
125     "  teq r3, #0                        \n"
126     "  bne 1b                            \n"
127     "  mov r0, #1                        \n"
128     "  mov pc, lr                        \n"
129     // return result: 1 success, 0 failure
130
131
132     // exchange
133     //  in-r0: memory reference
134     //  in-r1: new value
135     // out-r0: old value
136     ".p2align(8)                         \n"
137     "  1:                                \n"
138     "  ldrex r2, [r0]                    \n"
139     "  strex r3, r1, [r0]                \n"
140     "  cmp r3, #0                        \n"
141     "  bne 1b                            \n"
142     "  mov r0, r2                        \n"
143     "  mov pc, lr                        \n"
144     // return: always succeeds, old value
145     );