Support booting with a packaged boot loader
* Add new package haiku_loader.hpkg and move haiku_loader there. The package is built without compression, so that the stage 1 boot loader has a chance of loading it. * Adjust the stage 1 boot loader to load the haiku_loader package and relocate the boot loader code accordingly.
This commit is contained in:
@@ -197,10 +197,11 @@ SYSTEM_ADD_ONS_FILE_SYSTEMS = bfs bindfs btrfs cdda exfat ext2 fat iso9660 nfs
|
|||||||
googlefs ;
|
googlefs ;
|
||||||
|
|
||||||
|
|
||||||
# build the haiku system package and add it
|
# build the haiku system packages and add them
|
||||||
include [ FDirName $(HAIKU_BUILD_RULES_DIR) HaikuPackages ] ;
|
include [ FDirName $(HAIKU_BUILD_RULES_DIR) HaikuPackages ] ;
|
||||||
|
|
||||||
AddPackageFilesToHaikuImage system : haiku.hpkg ;
|
AddPackageFilesToHaikuImage system : haiku.hpkg ;
|
||||||
|
AddPackageFilesToHaikuImage system : haiku_loader.hpkg ;
|
||||||
|
|
||||||
|
|
||||||
AddSymlinkToHaikuImage . : /boot/common/apps ;
|
AddSymlinkToHaikuImage . : /boot/common/apps ;
|
||||||
@@ -315,9 +316,6 @@ SEARCH on <post-install>fresh_install
|
|||||||
= [ FDirName $(HAIKU_TOP) data common settings ] ;
|
= [ FDirName $(HAIKU_TOP) data common settings ] ;
|
||||||
AddFilesToHaikuImage common settings : <post-install>fresh_install ;
|
AddFilesToHaikuImage common settings : <post-install>fresh_install ;
|
||||||
|
|
||||||
# boot loader
|
|
||||||
AddFilesToHaikuImage system : haiku_loader ;
|
|
||||||
|
|
||||||
# decorators
|
# decorators
|
||||||
AddDirectoryToHaikuImage home config non-packaged add-ons decorators ;
|
AddDirectoryToHaikuImage home config non-packaged add-ons decorators ;
|
||||||
#AddFilesToHaikuImage home config add-ons decorators : ;
|
#AddFilesToHaikuImage home config add-ons decorators : ;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ local packages =
|
|||||||
Haiku
|
Haiku
|
||||||
HaikuCrossDevel
|
HaikuCrossDevel
|
||||||
HaikuDevel
|
HaikuDevel
|
||||||
|
HaikuLoader
|
||||||
HaikuUserguide
|
HaikuUserguide
|
||||||
HaikuWelcome
|
HaikuWelcome
|
||||||
MakefileEngine
|
MakefileEngine
|
||||||
|
|||||||
@@ -280,9 +280,6 @@ SEARCH on $(thinkPadFiles) = $(thinkpadDir) ;
|
|||||||
AddFilesToPackage data KeyboardLayouts ThinkPad
|
AddFilesToPackage data KeyboardLayouts ThinkPad
|
||||||
: $(thinkPadFiles) ;
|
: $(thinkPadFiles) ;
|
||||||
|
|
||||||
# boot loader
|
|
||||||
AddFilesToPackage : haiku_loader ;
|
|
||||||
|
|
||||||
# boot module links
|
# boot module links
|
||||||
AddBootModuleSymlinksToPackage
|
AddBootModuleSymlinksToPackage
|
||||||
acpi@x86 ata@ata pci isa@x86 config_manager dpc
|
acpi@x86 ata@ata pci isa@x86 config_manager dpc
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
local haikuLoaderPackage = haiku_loader.hpkg ;
|
||||||
|
HaikuPackage $(haikuLoaderPackage) ;
|
||||||
|
|
||||||
|
|
||||||
|
# boot loader
|
||||||
|
AddFilesToPackage : haiku_loader ;
|
||||||
|
|
||||||
|
|
||||||
|
# Force no compression, so the stage one loader can directly execute the boot
|
||||||
|
# loader.
|
||||||
|
HAIKU_PACKAGE_COMPRESSION_LEVEL on $(haikuLoaderPackage) = 0 ;
|
||||||
|
|
||||||
|
BuildHaikuPackage $(haikuLoaderPackage) : haiku_loader ;
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
name haiku_loader
|
||||||
|
version R1~alpha4_pm-1
|
||||||
|
architecture x86_gcc2
|
||||||
|
summary "The Haiku boot loader"
|
||||||
|
description "The Haiku boot loader."
|
||||||
|
|
||||||
|
packager "The Haiku build system"
|
||||||
|
vendor "Haiku Project"
|
||||||
|
|
||||||
|
copyrights "2001-2013 Haiku, Inc. et al"
|
||||||
|
licenses "MIT"
|
||||||
|
|
||||||
|
provides {
|
||||||
|
haiku_loader=R1~alpha4_pm-1
|
||||||
|
}
|
||||||
|
|
||||||
|
requires {
|
||||||
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
; Copyright 2005, Ingo Weinhold, [email protected].
|
; Copyright 2005-2013, Ingo Weinhold, [email protected].
|
||||||
; Distributed under the terms of the MIT License.
|
; Distributed under the terms of the MIT License.
|
||||||
;
|
;
|
||||||
; Stage 1 boot code for the good (?) old BIOS for use as boot block of HD
|
; Stage 1 boot code for the good (?) old BIOS for use as boot block of HD
|
||||||
; partitions. The offset of the partition in 512 byte blocks must be written at
|
; partitions. The offset of the partition in 512 byte blocks must be written at
|
||||||
; position PARTITION_OFFSET_OFFSET (32 bit little endian; makebootable does
|
; position PARTITION_OFFSET_OFFSET (32 bit little endian; makebootable does
|
||||||
; that) or otherwise the code can't find the partition.
|
; that) or otherwise the code can't find the partition.
|
||||||
; The partition must be a BFS formatted. The file "system/haiku_loader"
|
; The partition must be BFS formatted. The file "system/haiku_loader"
|
||||||
; (the stage 2 boot loader) loaded into memory at 0x1000:0x0000 (linear address
|
; (the stage 2 boot loader) loaded into memory at 0x1000:0x0000 (linear address
|
||||||
; 0x10000) and entered at 0x:1000:0x0200 with parameters eax - partition offset
|
; 0x10000) and entered at 0x:1000:0x0200 with parameters eax - partition offset
|
||||||
; in 512 byte blocks and dl - BIOS ID of the boot drive.
|
; in 512 byte blocks and dl - BIOS ID of the boot drive.
|
||||||
@@ -193,6 +193,12 @@ struc BPlusTreeNode
|
|||||||
.all_key_length resw 1
|
.all_key_length resw 1
|
||||||
endstruc
|
endstruc
|
||||||
|
|
||||||
|
; The beginning of a HPKG header
|
||||||
|
struc HPKGHeader
|
||||||
|
.magic resd 1
|
||||||
|
.header_size resw 1
|
||||||
|
; ...
|
||||||
|
|
||||||
; That's what esp points to after a "pushad".
|
; That's what esp points to after a "pushad".
|
||||||
struc PushadStack
|
struc PushadStack
|
||||||
.edi resd 1
|
.edi resd 1
|
||||||
@@ -631,7 +637,7 @@ kReadErrorString db "read error", 0
|
|||||||
kBadSuperBlockMagicString db "bad superblock", 0
|
kBadSuperBlockMagicString db "bad superblock", 0
|
||||||
kNotADirectoryString db "not a directory", 0
|
kNotADirectoryString db "not a directory", 0
|
||||||
kBadInodeMagicString db "bad inode", 0
|
kBadInodeMagicString db "bad inode", 0
|
||||||
kNoZbeosString db "haiku_loader not found", 0
|
kNoZbeosString db "no loader", 0
|
||||||
%else
|
%else
|
||||||
kErrorString db "Failed to load OS. Press any key to reboot..."
|
kErrorString db "Failed to load OS. Press any key to reboot..."
|
||||||
db 0
|
db 0
|
||||||
@@ -640,7 +646,8 @@ kErrorString db "Failed to load OS. Press any key to reboot..."
|
|||||||
; the path to the boot loader
|
; the path to the boot loader
|
||||||
kPathComponents:
|
kPathComponents:
|
||||||
pathComponent "system"
|
pathComponent "system"
|
||||||
pathComponent "haiku_loader"
|
pathComponent "packages"
|
||||||
|
pathComponent "haiku_loader.hpkg"
|
||||||
db 0
|
db 0
|
||||||
|
|
||||||
|
|
||||||
@@ -706,20 +713,65 @@ readBootLoader:
|
|||||||
and ax, ax
|
and ax, ax
|
||||||
jnz .read_loop
|
jnz .read_loop
|
||||||
|
|
||||||
; We have successfully read the complete boot loader. Set up the
|
; We have successfully read the complete boot loader package. The actual
|
||||||
|
; code is located at the beginning of the package file heap which starts
|
||||||
|
; directly after the header. Since the boot loader code expects to be
|
||||||
|
; located at a fixed address, we have to move it there.
|
||||||
|
|
||||||
|
; First set up the source and target segment registers. We keep the current
|
||||||
|
; value also in bx, since it is easier to do arithmetics with it. We keep
|
||||||
|
; the increment value for the segment registers in dx.
|
||||||
|
mov bx, 0x1000 ; initial ds and es value
|
||||||
|
push bx
|
||||||
|
pop ds
|
||||||
|
push bx
|
||||||
|
pop es
|
||||||
|
mov dx, bx ; the increment value for the segment registers
|
||||||
|
|
||||||
|
; Determine how much we have to copy and from where to where. si will be
|
||||||
|
; the source and di the destination pointer (both segment relative) and
|
||||||
|
; ecx is our byte count. To save instructions we only approximate the count.
|
||||||
|
; It may be almost a full segment greater than necessary. But that doesn't
|
||||||
|
; really harm.
|
||||||
|
mov ecx, edi
|
||||||
|
shr ecx, 12 ; byte count
|
||||||
|
xor di, di ; target
|
||||||
|
mov ax, [di + HPKGHeader.header_size] ; header size (big endian)
|
||||||
|
xchg ah, al
|
||||||
|
mov si, ax ; source
|
||||||
|
|
||||||
|
.move_loop:
|
||||||
|
movsb
|
||||||
|
test si, si
|
||||||
|
jnz .move_no_source_overflow
|
||||||
|
add bx, dx
|
||||||
|
push bx
|
||||||
|
pop ds
|
||||||
|
.move_no_source_overflow:
|
||||||
|
test di, di
|
||||||
|
jnz .move_no_destination_overflow
|
||||||
|
push bx
|
||||||
|
pop es
|
||||||
|
; Using bx (the value of ds) is fine, since we assume that the
|
||||||
|
; source is less than a segment ahead of the destination.
|
||||||
|
.move_no_destination_overflow:
|
||||||
|
dec ecx
|
||||||
|
jnz .move_loop
|
||||||
|
|
||||||
|
; We have successfully prepared the boot loader code. Set up the
|
||||||
; environment for it.
|
; environment for it.
|
||||||
; eax - partition offset in sectors
|
; eax - partition offset in sectors
|
||||||
|
push cs
|
||||||
|
pop ds
|
||||||
|
; temporarily reset ds, so we can access our variables
|
||||||
mov dword eax, [kPartitionOffset]
|
mov dword eax, [kPartitionOffset]
|
||||||
|
|
||||||
; dl - BIOS drive ID
|
; dl - BIOS drive ID
|
||||||
xor edx, edx
|
xor edx, edx
|
||||||
mov dl, [bios_drive_id]
|
mov dl, [bios_drive_id]
|
||||||
|
|
||||||
; ds, es
|
; Note: We don't have to set ds and es, since the stage 2 sets them
|
||||||
push 0x07c0
|
; anyway before accessing any data.
|
||||||
pop ds
|
|
||||||
push 0x1000
|
|
||||||
pop es
|
|
||||||
|
|
||||||
; enter the boot loader
|
; enter the boot loader
|
||||||
jmp 0x1000:0x200
|
jmp 0x1000:0x200
|
||||||
@@ -949,6 +1001,7 @@ bfsBlockToDiskBlock:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
%if 0
|
||||||
; _writeInt32
|
; _writeInt32
|
||||||
; Writes the given number in 8 digit hexadecimal representation to screen.
|
; Writes the given number in 8 digit hexadecimal representation to screen.
|
||||||
; Used for debugging only.
|
; Used for debugging only.
|
||||||
@@ -988,6 +1041,7 @@ _writeInt32:
|
|||||||
|
|
||||||
popad
|
popad
|
||||||
ret
|
ret
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
; check whether we are small enough
|
; check whether we are small enough
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user