5 * Copyright (C) 2008 Pawel Dziepak
7 * This file consist of functions that are called in order to run Manes. It
8 * includes initialization of hardware and internal kernel data structures.
9 * After this operation kernel can change to the standard way of working witch
10 * preemption, resources, actors and so on.
14 #include "kernel_state.h"
16 #include "arch/x86/launch.h"
17 #include "arch/x86/speaker.h"
19 #include "services/timer.h"
20 #include "services/logger.h"
21 #include "services/early_logger.h"
22 #include "services/service.h"
23 #include "services/service_manager.h"
25 #include "resources/resource_order.h"
26 #include "resources/isa.h"
27 #include "resources/tty0.h"
28 #include "resources/rs232.h"
29 #include "resources/pio.h"
30 #include "resources/speaker.h"
31 #include "resources/resource.h"
32 #include "resources/resource_manager.h"
33 #include "resources/slob.h"
35 #include "libs/delegate.h"
36 #include "libs/string.h"
38 template<typename T
, typename U
>
41 int strcmp(const char*, const char*);
44 (*new services::service_manager::call
<void,const char*>("early_logger","print"))("\nHELLO!");
51 { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
60 for (i
= 0; i
<= 8; i
++) {
61 temp
[i
] = numbers
[(cn
& 0x0F)];
64 for (i
= 7; i
!= -1; i
--) {
65 if (temp
[i
] == '0' && j
== 8 && i
!= 0)
75 //#define USE_MULTIBOOT
78 extern "C" void start() {
80 extern "C" void _start() {
82 /* Prepare to execute C++ code */
87 services::service_manager
*sman
= services::service_manager::get_instance();
89 /* Register early logger service */
90 delegate
<manes::object
*> serv
;
91 serv
.function(create_object
<manes::object
,services::early_logger
>);
92 services::service_type
earlylogger_type(0,"early_logger",1,serv
);
93 sman
->register_type(&earlylogger_type
);
95 delegate
<manes::object
*> serv1
;
96 serv1
.function(create_object
<manes::object
,services::timer
>);
97 services::service_type
timer_type(0,"timer",2,serv1
);
98 sman
->register_type(&timer_type
);
101 (*new services::service_manager::call
<void,const char*>("early_logger","print"))("OK.\nStarting Quarn OS...");
103 resources::resource_manager
*rman
= resources::resource_manager::get_instance();
105 delegate
<manes::object
*> res
;
108 resources::isa::register_resource();
111 resources::tty0::register_resource();
114 resources::rs232::register_resource();
117 resources::speaker::register_resource();
120 resources::pio::register_resource();
123 resources::slob::register_resource();
125 resources::slob
*_alloc
= (resources::slob
*)rman
->new_object("slob");
126 manes::kernel_state::get_instance()->set_memory_allocator(_alloc
);
129 //resources::res_buffer::register_resource();
131 resources::res_bus
*isabus
= (resources::res_bus
*)rman
->new_object("isa");
133 (*new services::service_manager::call
<void,const char*>("early_logger","print"))("\n\nScanning ISA bus...");
134 int isadevs
= isabus
->scan_bus();
135 (*new services::service_manager::call
<void,const char*>("early_logger","print"))("done. Found ");
136 (*new services::service_manager::call
<void,const char*>("early_logger","print"))(htoa(isadevs
));
137 (*new services::service_manager::call
<void,const char*>("early_logger","print"))(" devices.\n");
139 resources::res_stream
*Srstr
= rman
->get_resource
<resources::res_stream
>("rs232",0);
140 Srstr
->write_bytes("Starting Quarn OS...",20);
141 resources::res_stream
*rstr
= rman
->get_resource
<resources::res_stream
>("tty0",0);
143 resources::res_stream
*speak
= rman
->get_resource
<resources::res_stream
>("speaker",0);
145 rstr
->write_bytes("\nResources: running \n",26);
147 resources::pio
*str
= (resources::pio
*)rman
->new_object(rstr
, "pio");
149 str
->send_packet((void*)"Hello World!!!",14);
151 /* Sending orders (experimental) */
152 resources::resource_order
ord("speaker");
153 ord
.set_command("speed");
154 ord
.set_data
<int>(3);
155 str
->send_order(&ord
);
157 resources::resource_order
ord1("speaker");
158 ord1
.set_command("start");
159 ord1
.set_data
<bool>(true);
160 ord1
.set_data
<delegate
<void> >(ablah
);
161 str
->send_order(&ord1
);
163 /* Testing allocation of memory */
164 /* This code is a bit pointless but tests all possible circumstances
165 in which slob will have to allocate_space memory. */
167 resources::slob
&alloc
= *_alloc
;
168 (*new services::service_manager::call
<void,const char*>("early_logger","print"))(htoa((int)alloc
.allocate_space(0x10)->get_address())); // 50000
169 (*new services::service_manager::call
<void,const char*>("early_logger","print"))("\n");
170 (*new services::service_manager::call
<void,const char*>("early_logger","print"))(htoa((int)alloc
.allocate_space(0x1000)->get_address())); // 50010
171 (*new services::service_manager::call
<void,const char*>("early_logger","print"))("\n");
172 (*new services::service_manager::call
<void,const char*>("early_logger","print"))(htoa((int)alloc
.allocate_space(0x100)->get_address())); // 51010
173 (*new services::service_manager::call
<void,const char*>("early_logger","print"))("\n");
174 (*new services::service_manager::call
<void,const char*>("early_logger","print"))(htoa((int)alloc
.allocate_space(0x1000)->get_address())); //51111
175 alloc
.deallocate_space(new resources::res_buffer((void*)0x50010,10));
176 (*new services::service_manager::call
<void,const char*>("early_logger","print"))(htoa((int)alloc
.allocate_space(0x10000)->get_address()));
177 (*new services::service_manager::call
<void,const char*>("early_logger","print"))(htoa((int)alloc
.allocate_space(0x1000)->get_address()));
180 speak
->write_dwords(&temp
,1);
182 while (1) __asm__("hlt");