mirror of
https://github.com/justinian/jsix.git
synced 2025-12-10 00:14:32 -08:00
[init] Let init pass module data to drivers
First pass at passing module data to drivers in init. Also fix some remaining __handle_self references.
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <bootproto/devices/framebuffer.h>
|
||||
|
||||
#include <j6/init.h>
|
||||
#include <j6/errors.h>
|
||||
#include <j6/flags.h>
|
||||
@@ -13,66 +15,58 @@
|
||||
#include "scrollback.h"
|
||||
|
||||
extern "C" {
|
||||
int main(int, const char **);
|
||||
void _get_init(size_t *initc, struct j6_init_value **initv);
|
||||
}
|
||||
|
||||
extern j6_handle_t __handle_sys;
|
||||
extern j6_handle_t __handle_self;
|
||||
|
||||
struct entry
|
||||
{
|
||||
uint8_t bytes;
|
||||
uint8_t area;
|
||||
uint8_t severity;
|
||||
uint8_t sequence;
|
||||
char message[0];
|
||||
};
|
||||
|
||||
int
|
||||
main(int argc, const char **argv)
|
||||
extern "C" int
|
||||
driver_main(int argc, const char **argv, const char **env, const j6_init_args *init)
|
||||
{
|
||||
j6_log("fb driver starting");
|
||||
|
||||
size_t initc = 0;
|
||||
j6_init_value *initv = nullptr;
|
||||
using bootproto::devices::uefi_fb;
|
||||
using bootproto::devices::video_mode;
|
||||
using bootproto::devices::fb_layout;
|
||||
|
||||
j6_init_framebuffer *fb = nullptr;
|
||||
for (unsigned i = 0; i < initc; ++i) {
|
||||
if (initv[i].type == j6_init_desc_framebuffer) {
|
||||
fb = reinterpret_cast<j6_init_framebuffer*>(initv[i].data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
const uefi_fb *fb = reinterpret_cast<const uefi_fb*>(init->args[0]);
|
||||
|
||||
if (!fb || fb->addr == 0) {
|
||||
if (!fb || !fb->framebuffer) {
|
||||
j6_log("fb driver didn't find a framebuffer, exiting");
|
||||
return 1;
|
||||
}
|
||||
|
||||
util::buffer lfb = fb->framebuffer;
|
||||
const video_mode &mode = fb->mode;
|
||||
|
||||
j6_handle_t fb_handle = j6_handle_invalid;
|
||||
uint32_t flags =
|
||||
j6_vm_flag_write |
|
||||
j6_vm_flag_write_combine |
|
||||
j6_vm_flag_mmio;
|
||||
j6_status_t s = j6_system_map_phys(__handle_sys, &fb_handle, fb->addr, fb->size, flags);
|
||||
|
||||
j6_handle_t sys = j6_find_first_handle(j6_object_type_system);
|
||||
if (sys == j6_handle_invalid)
|
||||
return 1;
|
||||
|
||||
uintptr_t lfb_addr = reinterpret_cast<uintptr_t>(lfb.pointer);
|
||||
j6_status_t s = j6_system_map_phys( sys, &fb_handle, lfb_addr, lfb.count, flags);
|
||||
if (s != j6_status_ok) {
|
||||
return s;
|
||||
}
|
||||
|
||||
s = j6_vma_map(fb_handle, __handle_self, fb->addr);
|
||||
s = j6_vma_map(fb_handle, 0, lfb_addr);
|
||||
if (s != j6_status_ok) {
|
||||
return s;
|
||||
}
|
||||
|
||||
const screen::pixel_order order = (fb->flags & 1) ?
|
||||
screen::pixel_order::bgr8 : screen::pixel_order::rgb8;
|
||||
const screen::pixel_order order =
|
||||
(mode.layout == fb_layout::bgr8) ?
|
||||
screen::pixel_order::bgr8 : screen::pixel_order::rgb8;
|
||||
|
||||
screen scr(
|
||||
reinterpret_cast<void*>(fb->addr),
|
||||
fb->horizontal,
|
||||
fb->vertical,
|
||||
fb->scanline,
|
||||
reinterpret_cast<void*>(lfb.pointer),
|
||||
mode.horizontal,
|
||||
mode.vertical,
|
||||
mode.scanline,
|
||||
order);
|
||||
|
||||
font fnt;
|
||||
@@ -93,13 +87,14 @@ main(int argc, const char **argv)
|
||||
int pending = 0;
|
||||
constexpr int pending_threshold = 5;
|
||||
|
||||
j6_handle_t sys = __handle_sys;
|
||||
size_t buffer_size = 0;
|
||||
void *message_buffer = nullptr;
|
||||
|
||||
uint64_t seen = 0;
|
||||
|
||||
while (true) {
|
||||
size_t size = buffer_size;
|
||||
j6_status_t s = j6_system_get_log(sys, message_buffer, &size);
|
||||
j6_status_t s = j6_system_get_log(sys, seen, message_buffer, &size);
|
||||
|
||||
if (s == j6_err_insufficient) {
|
||||
free(message_buffer);
|
||||
@@ -112,9 +107,9 @@ main(int argc, const char **argv)
|
||||
}
|
||||
|
||||
if (size > 0) {
|
||||
entry *e = reinterpret_cast<entry*>(message_buffer);
|
||||
j6_log_entry *e = reinterpret_cast<j6_log_entry*>(message_buffer);
|
||||
|
||||
size_t eom = e->bytes - sizeof(entry);
|
||||
size_t eom = e->bytes - sizeof(j6_log_entry);
|
||||
e->message[eom] = 0;
|
||||
|
||||
scroll.add_line(e->message, eom);
|
||||
@@ -136,3 +131,4 @@ main(int argc, const char **argv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main () __attribute__ ((weak, alias ("driver_main")));
|
||||
|
||||
Reference in New Issue
Block a user