QTechOS/kernel/kernel.cpp

119 lines
2.6 KiB
C++
Raw Normal View History

#include <stdarg.h>
#include <inttypes.h>
#include <dtb/dtb.h>
#include <opensbi/opensbi.h>
#include <opensbi/extensions/legacy.h>
#include <opensbi/extensions/base.h>
#include <opensbi/extensions/timer.h>
#include <opensbi/extensions/ipi.h>
#include <opensbi/extensions/rfence.h>
#include <opensbi/extensions/hsm.h>
#include <opensbi/extensions/srst.h>
#include <opensbi/extensions/pmu.h>
void fmt(const char *f, ...) {
namespace legacy = drivers::opensbi::legacy;
2022-01-05 02:50:14 -05:00
va_list va;
va_start(va, f);
while(*f) {
if(*f != '{') {
legacy::console_putchar(*(f++));
2022-01-05 02:50:14 -05:00
continue;
}
f++;
while(*f != '}') {
if(!(*f))
return;
f++;
}
f++;
unsigned long v = va_arg(va, unsigned long);
for(int i = 0; i < 16; ++i) {
const char *digits = "0123456789abcdef";
int d = (v >> (60 - i * 4)) & 0xF;
legacy::console_putchar(digits[d]);
2022-01-05 02:50:14 -05:00
}
}
va_end(va);
}
extern "C" void kmain(unsigned long hart, void *dtb) {
2022-01-05 02:50:14 -05:00
(void)hart;
(void)dtb;
// D1 doesnt give me dtb ptr?
// dtb = (void *)0x5fb38580;
dtb::DeviceTree dt;
int res = dtb::validate_and_parse_header(dt, dtb);
if(!res) {
fmt("validate_and_parse_header: {}\n", res);
fmt("magic: {}\n", dt.meta.base);
dtb::print_reserved_regions(dt);
dtb::print_structure_block(dt);
}
namespace base = drivers::opensbi::base;
fmt("test\n");
auto ret = base::get_spec_version();
if(ret.error) {
fmt("get_spec_version failed\n");
} else {
fmt("spec version: {}\n", ret.value);
}
ret = base::get_impl_id();
if(ret.error) {
fmt("get_impl_id failed\n");
} else {
fmt("impl id: {}\n", ret.value);
}
ret = base::get_impl_version();
if(ret.error) {
fmt("get_impl_version failed\n");
} else {
fmt("impl version: {}\n", ret.value);
}
ret = base::get_mvendor_id();
if(ret.error) {
fmt("get_mvendor_id failed\n");
} else {
fmt("vendor id: {}\n", ret.value);
}
ret = base::get_march_id();
if(ret.error) {
fmt("get_march_id failed\n");
} else {
fmt("arch id: {}\n", ret.value);
}
ret = base::get_mimp_id();
if(ret.error) {
fmt("get_mimp_id failed\n");
} else {
fmt("imp id: {}\n", ret.value);
}
fmt("uintmax: {} bits\n", sizeof(uintmax_t) * 8);
fmt("HART: {}, DTB: {}\n", hart, dtb);
2022-07-31 21:20:48 -04:00
fmt("HALT\n");
while(1);
namespace hsm = drivers::opensbi::hsm;
hsm::hart_stop();
2022-01-05 02:50:14 -05:00
while(1);
}