This adds a new mach device called mbinfo that exposes the multiboot information to userspace.
--- i386/Makefrag.am | 2 ++ i386/i386at/conf.c | 8 +++++++ i386/i386at/mbinfo.c | 53 +++++++++++++++++++++++++++++++++++++++++ i386/i386at/mbinfo.h | 35 +++++++++++++++++++++++++++ i386/i386at/model_dep.c | 3 +++ 5 files changed, 101 insertions(+) create mode 100644 i386/i386at/mbinfo.c create mode 100644 i386/i386at/mbinfo.h diff --git a/i386/Makefrag.am b/i386/Makefrag.am index 7a339417..906ccc2d 100644 --- a/i386/Makefrag.am +++ b/i386/Makefrag.am @@ -69,6 +69,8 @@ libkernel_a_SOURCES += \ i386/i386at/kd_mouse.h \ i386/i386at/kdasm.S \ i386/i386at/kdsoft.h \ + i386/i386at/mbinfo.c \ + i386/i386at/mbinfo.h \ i386/i386at/mem.c \ i386/i386at/mem.h \ i386/i386at/rtc.c \ diff --git a/i386/i386at/conf.c b/i386/i386at/conf.c index ecbf1e45..ba056ea1 100644 --- a/i386/i386at/conf.c +++ b/i386/i386at/conf.c @@ -71,6 +71,9 @@ #include <device/intr.h> #define irqname "irq" +#include <i386at/mbinfo.h> +#define mbinfoname "mbinfo" + /* * List of devices - console must be at slot 0 */ @@ -157,6 +160,11 @@ struct dev_ops dev_name_list[] = nodev_async_in, nulldev_reset, nulldev_portdeath,0, nodev_info }, + { mbinfoname, nulldev_open, nulldev_close, mbinforead, + nulldev_write,nulldev_getstat,nulldev_setstat,nomap, + nodev_async_in, nulldev_reset, nulldev_portdeath,0, + nodev_info }, + }; int dev_name_count = sizeof(dev_name_list)/sizeof(dev_name_list[0]); diff --git a/i386/i386at/mbinfo.c b/i386/i386at/mbinfo.c new file mode 100644 index 00000000..521119b8 --- /dev/null +++ b/i386/i386at/mbinfo.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2024 Free Software Foundation, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <i386at/mbinfo.h> +#include <mach/vm_param.h> +#include <vm/pmap.h> +#include <device/ds_routines.h> + +struct multiboot_raw_info mb_info; + +void +mbinfo_register_boot_data(const struct multiboot_raw_info *mbi) +{ + mb_info = *mbi; +} + +io_return_t +mbinforead(dev_t dev, io_req_t ior) +{ + int err, count; + + /* Check if IO_COUNT is valid */ + if (ior->io_count != sizeof(struct multiboot_raw_info)) + return D_INVALID_SIZE; + + err = device_read_alloc(ior, (vm_size_t)ior->io_count); + if (err != KERN_SUCCESS) + return (err); + + count = 0; + uint8_t *byte = (uint8_t *)&mb_info; + while (count < ior->io_count) { + *(uint8_t *)(&ior->io_data[count]) = *byte; + count++; + byte++; + } + ior->io_residual = ior->io_count - count; + return (D_SUCCESS); +} diff --git a/i386/i386at/mbinfo.h b/i386/i386at/mbinfo.h new file mode 100644 index 00000000..0e623250 --- /dev/null +++ b/i386/i386at/mbinfo.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2024 Free Software Foundation, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef _I386AT_MBINFO_H_ +#define _I386AT_MBINFO_H_ 1 + +#include <sys/types.h> + +#include <vm/vm_types.h> +#include <mach/vm_prot.h> +#include <device/device_types.h> +#include <device/io_req.h> +#include <mach/machine/multiboot.h> + +extern struct multiboot_raw_info mb_info; + +void mbinfo_register_boot_data(const struct multiboot_raw_info *mbi); + +io_return_t mbinforead(dev_t dev, io_req_t ior); + +#endif /* !_I386AT_MBINFO_H_ */ diff --git a/i386/i386at/model_dep.c b/i386/i386at/model_dep.c index a3e9b630..01489353 100644 --- a/i386/i386at/model_dep.c +++ b/i386/i386at/model_dep.c @@ -75,6 +75,7 @@ #include <i386at/int_init.h> #include <i386at/kd.h> #include <i386at/rtc.h> +#include <i386at/mbinfo.h> #include <i386at/model_dep.h> #include <machine/irq.h> @@ -354,6 +355,8 @@ register_boot_data(const struct multiboot_raw_info *mbi) biosmem_register_boot_data(shdr->addr, shdr->addr + shdr->size, FALSE); } } + + mbinfo_register_boot_data(mbi); } #endif /* MACH_HYP */ -- 2.45.2