]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/sys_call_page-arm.cpp
update
[l4.git] / kernel / fiasco / src / kern / arm / sys_call_page-arm.cpp
1 INTERFACE:
2
3 #include "types.h"
4
5 //----------------------------------------------------------------------------
6 IMPLEMENTATION[arm && armv5]:
7
8 PRIVATE static inline NOEXPORT NEEDS["types.h"]
9 void
10 Sys_call_page::set_utcb_get_code(Mword *sys_calls)
11 {
12   *(sys_calls++) = 0xe3e00a02; // mvn r0, #8192
13   *(sys_calls++) = 0xe5100fff; // ldr r0, [r0, -#4095]
14   *(sys_calls++) = 0xe1a0f00e; // mov pc, lr
15 }
16
17 //----------------------------------------------------------------------------
18 IMPLEMENTATION[arm && (armv6 || armv7)]:
19
20 PRIVATE static inline NOEXPORT NEEDS["types.h"]
21 void
22 Sys_call_page::set_utcb_get_code(Mword *sys_calls)
23 {
24   *(sys_calls++) = 0xee1d0f70; // mrc 15, 0, r0, cr13, cr0, {3}
25   *(sys_calls++) = 0xe1a0f00e; // mov pc, lr
26 }
27
28 //----------------------------------------------------------------------------
29 IMPLEMENTATION:
30
31 #include <cstring>
32 #include "kernel_task.h"
33 #include "mem_layout.h"
34 #include "vmem_alloc.h"
35 #include "panic.h"
36
37 IMPLEMENT static
38 void
39 Sys_call_page::init()
40 {
41   Mword *sys_calls = (Mword*)Mem_layout::Syscalls;
42   if (!Vmem_alloc::page_alloc(sys_calls,
43                               Vmem_alloc::NO_ZERO_FILL, Vmem_alloc::User))
44     panic("FIASCO: can't allocate system-call page.\n");
45
46   for (unsigned i = 0; i < Config::PAGE_SIZE; i += sizeof(Mword))
47     *(sys_calls++) = 0xef000000; // svc
48
49   set_utcb_get_code((Mword*)(Mem_layout::Syscalls + 0xf00));
50
51   Kernel_task::kernel_task()
52       ->set_attributes(Mem_layout::Syscalls,
53                        Mem_space::Page_cacheable | Mem_space::Page_user_accessible);
54
55   Mem_unit::flush_cache();
56 }