mirror of
https://gitlab.com/qemu-project/openbios.git
synced 2024-02-13 08:34:06 +08:00
Move the Fcode loader from arch/*/fcodeload.c to libopenbios/fcode_load.c.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@siriusit.co.uk> git-svn-id: svn://coreboot.org/openbios/trunk/openbios-devel@714 f158a5a8-5612-0410-a976-696ce0be7e32
This commit is contained in:
committed by
Mark Cave-Ayland
parent
08ee7445f1
commit
0933f8c540
@@ -17,6 +17,7 @@
|
||||
<object source="elf_load.c" condition="AMD64"/>
|
||||
<object source="font_8x8.c" condition="FONT_8X8"/>
|
||||
<object source="font_8x16.c" condition="FONT_8X16"/>
|
||||
<object source="fcode_load.c" condition="SPARC64"/>
|
||||
<object source="forth_load.c" condition="X86"/>
|
||||
<object source="ipchecksum.c"/>
|
||||
<object source="linuxbios_info.c" condition="LINUXBIOS"/>
|
||||
|
||||
82
libopenbios/fcode_load.c
Normal file
82
libopenbios/fcode_load.c
Normal file
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
* FCode boot loader
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "kernel/kernel.h"
|
||||
#include "libopenbios/bindings.h"
|
||||
#include "libopenbios/fcode_load.h"
|
||||
#include "libopenbios/sys_info.h"
|
||||
#include "libc/diskio.h"
|
||||
#define printf printk
|
||||
#define debug printk
|
||||
|
||||
static int fd;
|
||||
|
||||
int fcode_load(const char *filename)
|
||||
{
|
||||
int retval = -1;
|
||||
uint8_t fcode_header[8];
|
||||
unsigned long start, size;
|
||||
unsigned int offset;
|
||||
|
||||
/* Mark the saved-program-state as invalid */
|
||||
feval("0 state-valid !");
|
||||
|
||||
fd = open_io(filename);
|
||||
if (!fd)
|
||||
goto out;
|
||||
|
||||
for (offset = 0; offset < 16 * 512; offset += 512) {
|
||||
seek_io(fd, offset);
|
||||
if (read_io(fd, &fcode_header, sizeof(fcode_header))
|
||||
!= sizeof(fcode_header)) {
|
||||
debug("Can't read FCode header from file %s\n", filename);
|
||||
retval = LOADER_NOT_SUPPORT;
|
||||
goto out;
|
||||
}
|
||||
switch (fcode_header[0]) {
|
||||
case 0xf0: // start0
|
||||
case 0xf1: // start1
|
||||
case 0xf2: // start2
|
||||
case 0xf3: // start4
|
||||
case 0xfd: // version1
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
|
||||
debug("Not a bootable FCode image\n");
|
||||
retval = LOADER_NOT_SUPPORT;
|
||||
goto out;
|
||||
|
||||
found:
|
||||
size = (fcode_header[4] << 24) | (fcode_header[5] << 16) |
|
||||
(fcode_header[6] << 8) | fcode_header[7];
|
||||
|
||||
start = 0x4000;
|
||||
|
||||
printf("Loading FCode image...\n");
|
||||
|
||||
seek_io(fd, offset + sizeof(fcode_header));
|
||||
|
||||
if ((size_t)read_io(fd, (void *)start, size) != size) {
|
||||
printf("Can't read file (size 0x%lx)\n", size);
|
||||
goto out;
|
||||
}
|
||||
|
||||
debug("Loaded %lu bytes\n", size);
|
||||
debug("entry point is %#lx\n", start);
|
||||
|
||||
// Initialise saved-program-state
|
||||
PUSH(start);
|
||||
feval("saved-program-state >sps.entry !");
|
||||
PUSH(size);
|
||||
feval("saved-program-state >sps.file-size !");
|
||||
feval("fcode saved-program-state >sps.file-type !");
|
||||
|
||||
feval("-1 state-valid !");
|
||||
|
||||
out:
|
||||
close_io(fd);
|
||||
return retval;
|
||||
}
|
||||
Reference in New Issue
Block a user