diff --git a/rootfs/boot/grub/grub.cfg b/rootfs/boot/grub/grub.cfg index bcb4c0e..ec491f3 100644 --- a/rootfs/boot/grub/grub.cfg +++ b/rootfs/boot/grub/grub.cfg @@ -2,4 +2,5 @@ set timeout=0 menuentry "mrubyvisor" { multiboot2 /boot/mrubyvisor.multiboot2 + module2 /boot/hello.rb } diff --git a/rootfs/boot/hello.rb b/rootfs/boot/hello.rb new file mode 100644 index 0000000..dee9a5c --- /dev/null +++ b/rootfs/boot/hello.rb @@ -0,0 +1 @@ +console_puts 'Hello, World! Ruby modules work!' diff --git a/src/main.c b/src/main.c index e05d49d..dda5136 100644 --- a/src/main.c +++ b/src/main.c @@ -34,6 +34,8 @@ static void *my_realloc(void *ptr, size_t size); static bool load_module(const char *source, size_t size, const char *cmdline); +static mrb_value ruby_console_puts(mrb_state *mrb, mrb_value self); + void main( const uint32_t multiboot2_info_magic, const struct KernAux_Multiboot2_Info *const multiboot2_info @@ -53,6 +55,15 @@ void main( ASSERT(mrb = mrb_open()); ASSERT(context = mrbc_context_new(mrb)); + // Define method Kernel#console_puts + mrb_define_method( + mrb, + mrb->kernel_module, + "console_puts", + ruby_console_puts, + MRB_ARGS_REQ(1) + ); + for ( const struct KernAux_Multiboot2_ITag_Module *module_tag = (const struct KernAux_Multiboot2_ITag_Module*) @@ -125,3 +136,13 @@ bool load_module( mrb_gc_arena_restore(mrb, arena); return status; } + +mrb_value ruby_console_puts( + mrb_state *const mrb, + mrb_value self __attribute__((unused)) +) { + const char *str = NULL; + mrb_get_args(mrb, "z", &str); + kernaux_drivers_console_puts(str); + return mrb_nil_value(); +}