cleaning resources code, improving resource_type
[quarnos.git] / manes / start.cpp
blob11fcf3eefc86f206f68d9a1dffa031ef8437afb1
1 /* Quarn OS
3 * Startup code
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.
13 #include "runtime.h"
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>
39 T* create_object();
41 int strcmp(const char*, const char*);
43 void aoh() {
44 (*new services::service_manager::call<void,const char*>("early_logger","print"))("\nHELLO!");
48 char *htoa(int cn)
50 char numbers[] =
51 { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
52 'E', 'F'
54 int i, j = 8;
55 char temp[8];
56 static char ret[10];
57 char tp;
59 memset(ret, 0, 9);
60 for (i = 0; i <= 8; i++) {
61 temp[i] = numbers[(cn & 0x0F)];
62 cn = cn >> 4;
64 for (i = 7; i != -1; i--) {
65 if (temp[i] == '0' && j == 8 && i != 0)
66 continue;
67 j--;
68 tp = temp[i];
69 ret[7 - j] = tp;
71 ret[9] = 0;
72 return ret;
75 //#define USE_MULTIBOOT
77 #ifdef USE_MULTIBOOT
78 extern "C" void start() {
79 #else
80 extern "C" void _start() {
81 #endif
82 /* Prepare to execute C++ code */
83 runtime_start();
85 arch::launch();
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);
99 delegate<void> ablah;
100 ablah.function(aoh);
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;
107 /* ISA bus */
108 resources::isa::register_resource();
110 /* TTY0 console */
111 resources::tty0::register_resource();
113 /* TTYS0 console */
114 resources::rs232::register_resource();
116 /* Speaker */
117 resources::speaker::register_resource();
119 /* PIO */
120 resources::pio::register_resource();
122 /* slob */
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);
128 /* res_buffer */
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()));
179 int temp = 1000;
180 speak->write_dwords(&temp,1);
182 while (1) __asm__("hlt");