2 * \file rtc/server/src/main.cc
3 * \brief Initialization and main server loop
6 * \author Frank Mehnert <fm3@os.inf.tu-dresden.de>
7 * \author Adam Lackorzynski <adam@os.inf.tu-dresden.de> */
10 * (c) 2003-2009 Author(s)
11 * economic rights: Technische Universität Dresden (Germany)
13 * This file is part of TUD:OS and distributed under the terms of the
14 * GNU General Public License 2.
15 * Please see the COPYING-GPL-2 file for details.
18 #include <l4/rtc/rtc.h>
19 #if defined ARCH_x86 || defined ARCH_amd64
20 #include <l4/util/rdtsc.h>
23 #include <l4/re/namespace>
24 #include <l4/cxx/exceptions>
25 #include <l4/re/error_helper>
26 #include <l4/re/util/cap_alloc>
27 #include <l4/sys/factory>
28 #include <l4/cxx/ipc_server>
29 #include <l4/cxx/iostream>
30 #include <l4/cxx/l4iostream>
32 #include <l4/sys/ipc_gate>
39 l4_uint32_t system_time_offs_rel_1970;
42 l4rtc_if_get_offset_component(l4_uint32_t *offset)
44 #if defined ARCH_x86 || defined ARCH_amd64
45 *offset = system_time_offs_rel_1970;
53 l4rtc_if_get_linux_tsc_scaler_component(l4_uint32_t *scaler)
55 #if defined ARCH_x86 || defined ARCH_amd64
56 *scaler = l4_scaler_tsc_linux;
66 int dispatch(l4_umword_t obj, L4::Ipc_iostream &ios);
70 Rtc_dispatcher::dispatch(l4_umword_t, L4::Ipc_iostream &ios)
83 case L4RTC_OPCODE_get_offset:
85 l4rtc_if_get_offset_component(&offset);
88 case L4RTC_OPCODE_get_linux_tsc_scaler:
90 l4rtc_if_get_linux_tsc_scaler_component(&scaler);
98 static L4::Server<> server(l4_utcb());
103 get_base_time_func_t get_base_time;
105 #if defined ARCH_x86 || defined ARCH_amd64
107 if (!(get_base_time = init_ux()))
109 if (!(get_base_time = init_x86()))
112 printf("Initialization failed, exiting\n");
118 #if defined ARCH_x86 || defined ARCH_amd64
119 l4_calibrate_tsc(l4re_kip());
125 L4::Cap<L4::Ipc_gate> cap = L4Re::Env::env()->get_cap<L4::Ipc_gate>("rtc");
126 L4Re::chksys(cap->bind_thread(L4Re::Env::env()->main_thread(), 0x1230),
127 "bind to rtc server gate");
129 catch (L4::Runtime_error const &e)
131 L4::cerr << e << "TERMINATED\n";
135 server.loop(Rtc_dispatcher());