mirror of
https://gitlab.com/bztsrc/bootboot.git
synced 2023-02-13 20:54:32 -05:00
Added initrd over serial to UEFI and docs
This commit is contained in:
parent
e80c8cc9ab
commit
6e56f2280f
11 changed files with 114 additions and 8 deletions
|
@ -120,7 +120,7 @@ Kifejezések
|
||||||
|
|
||||||
* _initrd_: induló [ramlemez kép](https://gitlab.com/bztsrc/bootboot/blob/master/README.md#installation)
|
* _initrd_: induló [ramlemez kép](https://gitlab.com/bztsrc/bootboot/blob/master/README.md#installation)
|
||||||
(lehet ROM-ban vagy flash-en, vagy egy GPT boot partíción BOOTBOOT\INITRD néven, vagy kitöltheti az egész partíciót, de akár
|
(lehet ROM-ban vagy flash-en, vagy egy GPT boot partíción BOOTBOOT\INITRD néven, vagy kitöltheti az egész partíciót, de akár
|
||||||
hálózatról vagy GRUB modulként is betöltehető). A formátuma és a holléte nincs meghatározva (a jó rész :-) ) és gzip tömörítést
|
hálózatról, soros vonalról vagy GRUB modulként is betöltehető). A formátuma és a holléte nincs meghatározva (a jó rész :-) ) és gzip tömörítést
|
||||||
is használhat.
|
is használhat.
|
||||||
|
|
||||||
* _betöltő_: (loader) egy natív futtatható a boot partíción vagy ROM-ban. Többarchitektúrás lemezeken több
|
* _betöltő_: (loader) egy natív futtatható a boot partíción vagy ROM-ban. Többarchitektúrás lemezeken több
|
||||||
|
|
|
@ -122,7 +122,7 @@ Glossary
|
||||||
|
|
||||||
* _initrd_: initial [ramdisk image](https://gitlab.com/bztsrc/bootboot/blob/master/README.md#installation)
|
* _initrd_: initial [ramdisk image](https://gitlab.com/bztsrc/bootboot/blob/master/README.md#installation)
|
||||||
(probably in ROM or flash, or on a GPT boot partition at BOOTBOOT\INITRD, or it can occupy the whole partition, or can be loaded
|
(probably in ROM or flash, or on a GPT boot partition at BOOTBOOT\INITRD, or it can occupy the whole partition, or can be loaded
|
||||||
over the network or as a GRUB module). It's format and whereabouts are not specified (the good part :-) ) and can be optionally gzip compressed.
|
over the network, over serial line or as a GRUB module). It's format and whereabouts are not specified (the good part :-) ) and can be optionally gzip compressed.
|
||||||
|
|
||||||
* _loader_: a native executable on the boot partition or in ROM. For multi-bootable disks
|
* _loader_: a native executable on the boot partition or in ROM. For multi-bootable disks
|
||||||
more loader implementations can co-exists.
|
more loader implementations can co-exists.
|
||||||
|
|
Binary file not shown.
Binary file not shown.
BIN
dist/bootboot.efi
vendored
BIN
dist/bootboot.efi
vendored
Binary file not shown.
BIN
dist/bootboot.rom
vendored
BIN
dist/bootboot.rom
vendored
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
extern unsigned char binary_boot_bin[512];
|
extern unsigned char binary_boot_bin[512];
|
||||||
extern unsigned char binary_bootboot_bin[12288];
|
extern unsigned char binary_bootboot_bin[12288];
|
||||||
extern unsigned char binary_bootboot_efi[99396];
|
extern unsigned char binary_bootboot_efi[100420];
|
||||||
extern unsigned char binary_bootboot_img[34672];
|
extern unsigned char binary_bootboot_img[34672];
|
||||||
extern unsigned char binary_LICENCE_broadcom[1594];
|
extern unsigned char binary_LICENCE_broadcom[1594];
|
||||||
extern unsigned char binary_bootcode_bin[52480];
|
extern unsigned char binary_bootcode_bin[52480];
|
||||||
|
|
|
@ -275,6 +275,71 @@ typedef struct {
|
||||||
} EFI_PCI_OPTION_ROM_TABLE;
|
} EFI_PCI_OPTION_ROM_TABLE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef EFI_SERIAL_IO_PROTOCOL_GUID
|
||||||
|
#define EFI_SERIAL_IO_PROTOCOL_GUID \
|
||||||
|
{ 0xBB25CF6F, 0xF1D4, 0x11D2, {0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0xFD} }
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
DefaultParity,
|
||||||
|
NoParity,
|
||||||
|
EvenParity,
|
||||||
|
OddParity,
|
||||||
|
MarkParity,
|
||||||
|
SpaceParity
|
||||||
|
} EFI_PARITY_TYPE;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
DefaultStopBits,
|
||||||
|
OneStopBit, // 1 stop bit
|
||||||
|
OneFiveStopBits, // 1.5 stop bits
|
||||||
|
TwoStopBits // 2 stop bits
|
||||||
|
} EFI_STOP_BITS_TYPE;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SERIAL_DUMMY)(
|
||||||
|
IN EFI_SERIAL_IO_PROTOCOL *This
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SERIAL_SET_ATTRIBUTES) (
|
||||||
|
IN struct _EFI_SERIAL_IO_PROTOCOL *This,
|
||||||
|
IN UINT64 BaudRate,
|
||||||
|
IN UINT32 ReceiveFifoDepth,
|
||||||
|
IN UINT32 Timeout,
|
||||||
|
IN EFI_PARITY_TYPE Parity,
|
||||||
|
IN UINT8 DataBits,
|
||||||
|
IN EFI_STOP_BITS_TYPE StopBits
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SERIAL_WRITE) (
|
||||||
|
IN struct _EFI_SERIAL_IO_PROTOCOL *This,
|
||||||
|
IN OUT UINTN *BufferSize,
|
||||||
|
IN VOID *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SERIAL_READ) (
|
||||||
|
IN struct _EFI_SERIAL_IO_PROTOCOL *This,
|
||||||
|
IN OUT UINTN *BufferSize,
|
||||||
|
OUT VOID *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct _EFI_SERIAL_IO_PROTOCOL {
|
||||||
|
UINT32 Revision;
|
||||||
|
EFI_SERIAL_DUMMY Reset;
|
||||||
|
EFI_SERIAL_SET_ATTRIBUTES SetAttributes;
|
||||||
|
EFI_SERIAL_DUMMY SetControl;
|
||||||
|
EFI_SERIAL_DUMMY GetControl;
|
||||||
|
EFI_SERIAL_WRITE Write;
|
||||||
|
EFI_SERIAL_READ Read;
|
||||||
|
} EFI_SERIAL_IO_PROTOCOL;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*** other defines and structs ***/
|
/*** other defines and structs ***/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 magic[8];
|
UINT8 magic[8];
|
||||||
|
@ -1022,14 +1087,14 @@ EFI_STATUS
|
||||||
GetLFB()
|
GetLFB()
|
||||||
{
|
{
|
||||||
EFI_STATUS status;
|
EFI_STATUS status;
|
||||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *gop;
|
EFI_GRAPHICS_OUTPUT_PROTOCOL *gop = NULL;
|
||||||
EFI_GUID gopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
|
EFI_GUID gopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
|
||||||
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info;
|
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info;
|
||||||
UINTN i, imax, SizeOfInfo, nativeMode, selectedMode=9999, sw=0, sh=0, valid;
|
UINTN i, imax, SizeOfInfo, nativeMode, selectedMode=9999, sw=0, sh=0, valid;
|
||||||
|
|
||||||
//GOP
|
//GOP
|
||||||
status = uefi_call_wrapper(BS->LocateProtocol, 3, &gopGuid, NULL, (void**)&gop);
|
status = uefi_call_wrapper(BS->LocateProtocol, 3, &gopGuid, NULL, (void**)&gop);
|
||||||
if(EFI_ERROR(status))
|
if(EFI_ERROR(status) && gop)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
// minimum resolution
|
// minimum resolution
|
||||||
|
@ -1363,10 +1428,12 @@ efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
|
||||||
#if USE_MP_SERVICES
|
#if USE_MP_SERVICES
|
||||||
EFI_EVENT Event;
|
EFI_EVENT Event;
|
||||||
EFI_GUID mpspGuid = EFI_MP_SERVICES_PROTOCOL_GUID;
|
EFI_GUID mpspGuid = EFI_MP_SERVICES_PROTOCOL_GUID;
|
||||||
EFI_MP_SERVICES_PROTOCOL *mp;
|
EFI_MP_SERVICES_PROTOCOL *mp = NULL;
|
||||||
UINT8 pibuffer[100];
|
UINT8 pibuffer[100];
|
||||||
EFI_PROCESSOR_INFORMATION *pibuf=(EFI_PROCESSOR_INFORMATION*)pibuffer;
|
EFI_PROCESSOR_INFORMATION *pibuf=(EFI_PROCESSOR_INFORMATION*)pibuffer;
|
||||||
#endif
|
#endif
|
||||||
|
EFI_GUID SerIoGuid = EFI_SERIAL_IO_PROTOCOL_GUID;
|
||||||
|
EFI_SERIAL_IO_PROTOCOL *ser = NULL;
|
||||||
UINTN bsp_num=0, i, j=0, x,y, handle_size=0,memory_map_size=0, map_key=0, desc_size=0;
|
UINTN bsp_num=0, i, j=0, x,y, handle_size=0,memory_map_size=0, map_key=0, desc_size=0;
|
||||||
UINT32 desc_version=0;
|
UINT32 desc_version=0;
|
||||||
UINT64 lba_s=0,lba_e=0,sysptr;
|
UINT64 lba_s=0,lba_e=0,sysptr;
|
||||||
|
@ -1478,6 +1545,45 @@ efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
|
||||||
foundinrom:
|
foundinrom:
|
||||||
uefi_call_wrapper(BS->FreePages, 2, (EFI_PHYSICAL_ADDRESS)memory_map, (memory_map_size+PAGESIZE-1)/PAGESIZE);
|
uefi_call_wrapper(BS->FreePages, 2, (EFI_PHYSICAL_ADDRESS)memory_map, (memory_map_size+PAGESIZE-1)/PAGESIZE);
|
||||||
}
|
}
|
||||||
|
// try reading the initrd from serial line
|
||||||
|
if(EFI_ERROR(status) || initrd.ptr==NULL){
|
||||||
|
status = uefi_call_wrapper(BS->LocateProtocol, 3, &SerIoGuid, NULL, (void**)&ser);
|
||||||
|
if(!EFI_ERROR(status) && ser) {
|
||||||
|
// 1000 microsec timeout, mode 115200,8,n,1
|
||||||
|
status = uefi_call_wrapper(ser->SetAttributes, 7, ser, 115200, 0, 1000, NoParity, 8, OneStopBit);
|
||||||
|
if(!EFI_ERROR(status)) {
|
||||||
|
i = 3;
|
||||||
|
uefi_call_wrapper(ser->Write, 3, ser, &i, "\003\003\003");
|
||||||
|
i = 4; initrd.size = 0;
|
||||||
|
status = uefi_call_wrapper(ser->Read, 3, ser, &i, (VOID*)&initrd.size);
|
||||||
|
if(!EFI_ERROR(status) && i == 4) {
|
||||||
|
i = 2;
|
||||||
|
if(initrd.size < 32 || initrd.size >= INITRD_MAXSIZE*1024*1024) {
|
||||||
|
uefi_call_wrapper(ser->Write, 3, ser, &i, "SE");
|
||||||
|
initrd.size = 0;
|
||||||
|
status = EFI_LOAD_ERROR;
|
||||||
|
} else {
|
||||||
|
uefi_call_wrapper(BS->AllocatePages, 4, 0, 2, (initrd.size+PAGESIZE-1)/PAGESIZE,
|
||||||
|
(EFI_PHYSICAL_ADDRESS*)&initrd.ptr);
|
||||||
|
if (initrd.ptr == NULL) {
|
||||||
|
uefi_call_wrapper(ser->Write, 3, ser, &i, "SE");
|
||||||
|
return report(EFI_OUT_OF_RESOURCES,L"AllocatePages");
|
||||||
|
}
|
||||||
|
uefi_call_wrapper(ser->Write, 3, ser, &i, "OK");
|
||||||
|
i = initrd.size;
|
||||||
|
status = uefi_call_wrapper(ser->Read, 3, ser, &i, (VOID*)initrd.ptr);
|
||||||
|
if(EFI_ERROR(status) || i != initrd.size) {
|
||||||
|
uefi_call_wrapper(BS->FreePages, 2, (EFI_PHYSICAL_ADDRESS)initrd.ptr,
|
||||||
|
(initrd.size+PAGESIZE-1)/PAGESIZE);
|
||||||
|
initrd.ptr = NULL;
|
||||||
|
initrd.size = 0;
|
||||||
|
status = EFI_LOAD_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// fall back to INITRD on filesystem
|
// fall back to INITRD on filesystem
|
||||||
if(EFI_ERROR(status) || initrd.ptr==NULL){
|
if(EFI_ERROR(status) || initrd.ptr==NULL){
|
||||||
// if the user presses any key now, we fallback to backup initrd
|
// if the user presses any key now, we fallback to backup initrd
|
||||||
|
@ -1718,7 +1824,7 @@ gzerr: return report(EFI_COMPROMISED_DATA,L"Unable to uncompress");
|
||||||
// Symmetric Multi Processing support
|
// Symmetric Multi Processing support
|
||||||
#if USE_MP_SERVICES
|
#if USE_MP_SERVICES
|
||||||
status = uefi_call_wrapper(BS->LocateProtocol, 3, &mpspGuid, NULL, (void**)&mp);
|
status = uefi_call_wrapper(BS->LocateProtocol, 3, &mpspGuid, NULL, (void**)&mp);
|
||||||
if(!EFI_ERROR(status)) {
|
if(!EFI_ERROR(status) && mp) {
|
||||||
// override default values in bootboot struct
|
// override default values in bootboot struct
|
||||||
status = uefi_call_wrapper(mp->GetNumberOfProcessors, 3, mp, &i, &j);
|
status = uefi_call_wrapper(mp->GetNumberOfProcessors, 3, mp, &i, &j);
|
||||||
if(!EFI_ERROR(status)) {
|
if(!EFI_ERROR(status)) {
|
||||||
|
|
Loading…
Reference in a new issue