[kernel] Make stdout channel available to processes

The "fake" stdout channel is now being passed in the new j6_process_init
structure to processes, and nulldrv now uses it to print a message to
the console.
This commit is contained in:
2020-08-30 18:47:14 -07:00
parent 724b846ee4
commit 42455873ff
7 changed files with 58 additions and 10 deletions

View File

@@ -261,11 +261,16 @@ console::set_color(uint8_t fg, uint8_t bg)
}
}
void
size_t
console::puts(const char *message)
{
while (message && *message)
size_t n = 0;
while (message && *message) {
n++;
putc(*message++);
}
return n;
}
void

View File

@@ -16,7 +16,7 @@ public:
void set_color(uint8_t fg = 7, uint8_t bg = 0);
void putc(char c);
void puts(const char *message);
size_t puts(const char *message);
void vprintf(const char *fmt, va_list args);
inline void printf(const char *fmt, ...)

View File

@@ -92,7 +92,13 @@ stdout_task()
}
buffer[n] = 0;
cons->puts(reinterpret_cast<const char *>(buffer));
const char *s = reinterpret_cast<const char *>(buffer);
while (n) {
size_t r = cons->puts(s);
n -= r + 1;
s += r + 1;
}
}
}
@@ -193,6 +199,8 @@ kernel_main(args::header *header)
syscall_enable();
scheduler *sched = new scheduler(devices.get_lapic());
std_out = new channel;
for (auto &ird : initrds) {
for (auto &f : ird.files()) {
if (f.executable()) {
@@ -203,8 +211,6 @@ kernel_main(args::header *header)
}
}
std_out = new channel;
sched->create_kernel_task(logger_task, scheduler::max_priority-1, true);
sched->create_kernel_task(stdout_task, scheduler::max_priority-1, true);

View File

@@ -11,6 +11,7 @@
#include "kernel_memory.h"
#include "log.h"
#include "msr.h"
#include "objects/channel.h"
#include "objects/process.h"
#include "page_manager.h"
#include "scheduler.h"
@@ -18,6 +19,7 @@
#include "elf/elf.h"
#include "kutil/assert.h"
scheduler *scheduler::s_instance = nullptr;
const uint64_t rflags_noint = 0x002;
@@ -69,6 +71,7 @@ load_process_image(const void *image_start, size_t bytes, TCB *tcb)
page_manager *pager = page_manager::get();
thread *th = thread::from_tcb(tcb);
process &proc = th->parent();
log::debug(logs::loader, "Loading task! ELF: %016lx [%d]", image_start, bytes);
@@ -115,6 +118,16 @@ load_process_image(const void *image_start, size_t bytes, TCB *tcb)
kutil::memcpy(dest, src, header->size);
}
tcb->rsp3 -= 2 * sizeof(uint64_t);
uint64_t *sentinel = reinterpret_cast<uint64_t*>(tcb->rsp3);
sentinel[0] = sentinel[1] = 0;
tcb->rsp3 -= sizeof(j6_process_init);
j6_process_init *init = reinterpret_cast<j6_process_init*>(tcb->rsp3);
extern channel *std_out;
init->output = proc.add_handle(std_out);
th->clear_state(thread::state::loading);
uintptr_t entrypoint = image.entrypoint();