2008-06-03 19:17:59 +04:00
|
|
|
/*
|
2009-08-13 15:07:57 +04:00
|
|
|
* Copyright 2002-2009, Axel Dörfler, axeld@pinc-software.de.
|
2004-11-15 20:59:15 +03:00
|
|
|
* Distributed under the terms of the MIT License.
|
|
|
|
*
|
|
|
|
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
|
|
|
* Distributed under the terms of the NewOS License.
|
|
|
|
*/
|
2003-10-08 01:58:48 +04:00
|
|
|
#ifndef KERNEL_BOOT_KERNEL_ARGS_H
|
|
|
|
#define KERNEL_BOOT_KERNEL_ARGS_H
|
|
|
|
|
|
|
|
|
|
|
|
#include <SupportDefs.h>
|
|
|
|
|
2004-06-01 02:44:24 +04:00
|
|
|
#include <boot/elf.h>
|
2004-11-15 20:59:15 +03:00
|
|
|
#include <boot/disk_identifier.h>
|
2005-01-10 10:36:08 +03:00
|
|
|
#include <boot/driver_settings.h>
|
|
|
|
|
2003-10-08 04:17:24 +04:00
|
|
|
#include <platform_kernel_args.h>
|
|
|
|
#include <arch_kernel_args.h>
|
|
|
|
|
2012-06-21 21:02:23 +04:00
|
|
|
#include <util/FixedWidthPointer.h>
|
|
|
|
|
2003-10-16 21:55:21 +04:00
|
|
|
|
2004-10-19 21:02:11 +04:00
|
|
|
#define CURRENT_KERNEL_ARGS_VERSION 1
|
2009-08-13 15:07:57 +04:00
|
|
|
#define MAX_KERNEL_ARGS_RANGE 20
|
[Sorry, couldn't split this one up any further.]
* Images preloaded by the boot loader had to be modules to be of any use
to the kernel. Extended the mechanism so that any images not accepted
by the module code would later be tried to be added as drivers by the
devfs. This is a little hacky ATM, since the devfs manages the drivers
using a hash map keyed by the drivers inode ID, which those drivers
obviously don't have.
* The devfs emulates read_pages() using read(), if the device driver
doesn't implement the former (all old-style drivers), thus making it
possible to BFS, which uses the file cache which in turn requires
read_pages(), on the device. write_pages() emulation is still missing.
* Replaced the kernel_args::boot_disk structure by a KMessage, which can
more flexibly be extended and deals more gracefully with
arbitrarily-size data. The disk_identifier structure still exists,
though. It is added as message field in cases where needed (non net
boot). Moved the boot_drive_number field of the bios_ia32 platform
specific args into the message.
* Made the stage 1 PXE boot loader superfluous. Moved the relevant
initialization code into the stage 2 loader, which can now be loaded
directly via PXE.
* The PXE boot loader does now download a boot tgz archive via TFTP. It
does no longer use the RemoteDisk protocol (it could actually be
removed from the boot loader). It also parses the DHCP options in the
DHCPACK packet provided by PXE and extracts the root path to be
mounted by the kernel.
* Reorganized the boot volume search in the kernel (vfs_boot.cpp) and
added support for network boot. In this case the net stack is
initialized and the network interface the boot loader used is brought
up and configured. Since NBD and RemoteDisk are our only options for
net boot (and those aren't really configurable dynamically) ATM, the
the boot device is found automatically by the disk device manager.
Booting via PXE does work to some degree now. The most grievous problem
is that loading certain drivers or kernel modules (or related activity)
causes a reboot (likely a triple fault, though one wonders where our
double fault handler is on vacation). Namely the keyboard and mouse input
server add-ons need to be deactivated as well as the media server.
A smaller problem is the net server, which apparently tries to
(re-)configure the network interface we're using to boot, which
obviously doesn't work out that well. So, if all this stuff is disabled
Haiku does fully boot, when using the RemoteDisk protocol (not being
able to use keyboard or mouse doesn't make this a particular fascinating
experience, though ;-)). I had no luck with NBD -- it seemed to have
protocol problems with the servers I tried.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21611 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-07-15 06:10:15 +04:00
|
|
|
|
|
|
|
// names of common boot_volume fields
|
|
|
|
#define BOOT_METHOD "boot method"
|
|
|
|
#define BOOT_VOLUME_USER_SELECTED "user selected"
|
|
|
|
#define BOOT_VOLUME_BOOTED_FROM_IMAGE "booted from image"
|
2011-06-19 16:34:24 +04:00
|
|
|
#define BOOT_VOLUME_PACKAGED "packaged"
|
[Sorry, couldn't split this one up any further.]
* Images preloaded by the boot loader had to be modules to be of any use
to the kernel. Extended the mechanism so that any images not accepted
by the module code would later be tried to be added as drivers by the
devfs. This is a little hacky ATM, since the devfs manages the drivers
using a hash map keyed by the drivers inode ID, which those drivers
obviously don't have.
* The devfs emulates read_pages() using read(), if the device driver
doesn't implement the former (all old-style drivers), thus making it
possible to BFS, which uses the file cache which in turn requires
read_pages(), on the device. write_pages() emulation is still missing.
* Replaced the kernel_args::boot_disk structure by a KMessage, which can
more flexibly be extended and deals more gracefully with
arbitrarily-size data. The disk_identifier structure still exists,
though. It is added as message field in cases where needed (non net
boot). Moved the boot_drive_number field of the bios_ia32 platform
specific args into the message.
* Made the stage 1 PXE boot loader superfluous. Moved the relevant
initialization code into the stage 2 loader, which can now be loaded
directly via PXE.
* The PXE boot loader does now download a boot tgz archive via TFTP. It
does no longer use the RemoteDisk protocol (it could actually be
removed from the boot loader). It also parses the DHCP options in the
DHCPACK packet provided by PXE and extracts the root path to be
mounted by the kernel.
* Reorganized the boot volume search in the kernel (vfs_boot.cpp) and
added support for network boot. In this case the net stack is
initialized and the network interface the boot loader used is brought
up and configured. Since NBD and RemoteDisk are our only options for
net boot (and those aren't really configurable dynamically) ATM, the
the boot device is found automatically by the disk device manager.
Booting via PXE does work to some degree now. The most grievous problem
is that loading certain drivers or kernel modules (or related activity)
causes a reboot (likely a triple fault, though one wonders where our
double fault handler is on vacation). Namely the keyboard and mouse input
server add-ons need to be deactivated as well as the media server.
A smaller problem is the net server, which apparently tries to
(re-)configure the network interface we're using to boot, which
obviously doesn't work out that well. So, if all this stuff is disabled
Haiku does fully boot, when using the RemoteDisk protocol (not being
able to use keyboard or mouse doesn't make this a particular fascinating
experience, though ;-)). I had no luck with NBD -- it seemed to have
protocol problems with the servers I tried.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21611 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-07-15 06:10:15 +04:00
|
|
|
#define BOOT_VOLUME_PARTITION_OFFSET "partition offset"
|
|
|
|
#define BOOT_VOLUME_DISK_IDENTIFIER "disk identifier"
|
|
|
|
|
|
|
|
// boot methods
|
|
|
|
enum {
|
|
|
|
BOOT_METHOD_HARD_DISK = 0,
|
|
|
|
BOOT_METHOD_CD = 1,
|
|
|
|
BOOT_METHOD_NET = 2,
|
|
|
|
|
|
|
|
BOOT_METHOD_DEFAULT = BOOT_METHOD_HARD_DISK
|
|
|
|
};
|
2004-06-15 20:54:04 +04:00
|
|
|
|
2003-10-08 01:58:48 +04:00
|
|
|
typedef struct kernel_args {
|
2004-06-15 20:54:04 +04:00
|
|
|
uint32 kernel_args_size;
|
|
|
|
uint32 version;
|
|
|
|
|
2012-06-22 22:24:51 +04:00
|
|
|
FixedWidthPointer<struct preloaded_image> kernel_image;
|
2012-06-21 21:02:23 +04:00
|
|
|
FixedWidthPointer<struct preloaded_image> preloaded_images;
|
2003-10-16 21:55:21 +04:00
|
|
|
|
2012-06-21 22:48:03 +04:00
|
|
|
uint32 num_physical_memory_ranges;
|
|
|
|
addr_range physical_memory_range[MAX_PHYSICAL_MEMORY_RANGE];
|
|
|
|
uint32 num_physical_allocated_ranges;
|
|
|
|
addr_range physical_allocated_range[MAX_PHYSICAL_ALLOCATED_RANGE];
|
|
|
|
uint32 num_virtual_allocated_ranges;
|
|
|
|
addr_range virtual_allocated_range[MAX_VIRTUAL_ALLOCATED_RANGE];
|
|
|
|
uint32 num_kernel_args_ranges;
|
|
|
|
addr_range kernel_args_range[MAX_KERNEL_ARGS_RANGE];
|
|
|
|
uint64 ignored_physical_memory;
|
2003-10-08 01:58:48 +04:00
|
|
|
|
|
|
|
uint32 num_cpus;
|
|
|
|
addr_range cpu_kstack[MAX_BOOT_CPUS];
|
|
|
|
|
2012-06-20 14:53:47 +04:00
|
|
|
// boot volume KMessage data
|
2012-06-21 21:02:23 +04:00
|
|
|
FixedWidthPointer<void> boot_volume;
|
2012-06-20 14:53:47 +04:00
|
|
|
int32 boot_volume_size;
|
2004-11-15 20:59:15 +03:00
|
|
|
|
2012-06-21 21:02:23 +04:00
|
|
|
FixedWidthPointer<struct driver_settings_file> driver_settings;
|
2005-01-10 10:36:08 +03:00
|
|
|
|
2004-10-19 21:02:11 +04:00
|
|
|
struct {
|
2012-06-21 22:48:03 +04:00
|
|
|
addr_range physical_buffer;
|
2007-11-27 19:33:19 +03:00
|
|
|
uint32 bytes_per_row;
|
|
|
|
uint16 width;
|
|
|
|
uint16 height;
|
|
|
|
uint8 depth;
|
|
|
|
bool enabled;
|
2004-10-19 21:02:11 +04:00
|
|
|
} frame_buffer;
|
|
|
|
|
2012-06-21 21:02:23 +04:00
|
|
|
FixedWidthPointer<void> vesa_modes;
|
2009-08-14 13:49:28 +04:00
|
|
|
uint16 vesa_modes_size;
|
|
|
|
uint8 vesa_capabilities;
|
2012-06-21 21:02:23 +04:00
|
|
|
FixedWidthPointer<void> edid_info;
|
2008-03-30 15:01:41 +04:00
|
|
|
|
2012-06-21 21:02:23 +04:00
|
|
|
FixedWidthPointer<void> debug_output;
|
2007-11-27 15:59:34 +03:00
|
|
|
uint32 debug_size;
|
2010-03-11 20:46:36 +03:00
|
|
|
bool keep_debug_output_buffer;
|
2007-11-27 15:59:34 +03:00
|
|
|
|
2003-10-08 01:58:48 +04:00
|
|
|
platform_kernel_args platform_args;
|
2003-10-08 04:17:24 +04:00
|
|
|
arch_kernel_args arch_args;
|
2008-04-06 01:15:43 +04:00
|
|
|
|
|
|
|
// bootsplash data
|
2012-06-21 21:02:23 +04:00
|
|
|
FixedWidthPointer<uint8> boot_splash;
|
2008-04-06 01:15:43 +04:00
|
|
|
|
2012-06-21 21:02:23 +04:00
|
|
|
} _PACKED kernel_args;
|
2003-10-08 01:58:48 +04:00
|
|
|
|
|
|
|
#endif /* KERNEL_BOOT_KERNEL_ARGS_H */
|