# HG changeset patch # User taiki # Date 1360524642 -32400 # Node ID e3accb15b1bbeee2cb81ad0b6bceef983e628642 # Parent 5e184d4c01b82e198f0f8eff38fe3abcd11894c4 add alloc and loader. diff -r 5e184d4c01b8 -r e3accb15b1bb boot/alloc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/boot/alloc.c Mon Feb 11 04:30:42 2013 +0900 @@ -0,0 +1,7 @@ + +EFI_STATUS +alloc() +{ + status = uefi_call_wrapper(BS->AllocatePool, 3, EfiLoaderData, size, (VOID **)dev_tab); + return status; +} diff -r 5e184d4c01b8 -r e3accb15b1bb boot/bootx64.c --- a/boot/bootx64.c Sun Feb 10 00:15:05 2013 +0900 +++ b/boot/bootx64.c Mon Feb 11 04:30:42 2013 +0900 @@ -8,7 +8,7 @@ #include "bootx64.h" #include "mach-o/mach_o.h" -extern EFI_STATUS open(fs_t *fs, EFI_FILE_HANDLE *fd, CHAR16 *name); +extern EFI_STATUS open(fs_interface_t *this, EFI_FILE_HANDLE *fd, CHAR16 *name); extern EFI_STATUS close(fs_t *fs, EFI_FILE_HANDLE *fd); extern EFI_STATUS read(fs_t *fs, EFI_FILE_HANDLE *fd, VOID *buf, UINTN *size); extern EFI_STATUS seek(fs_t *fs, EFI_FILE_HANDLE *fd, UINTN newpos); @@ -43,10 +43,12 @@ fs_t fs; dev_tab_t boot_dev; + fs_interface_t fsi; + status = config_fs(&fs, info->DeviceHandle ,&boot_dev); EFI_FILE_HANDLE fd; - open(&fs, &fd, kname); + open(&fsi, &fd, kname); load(&fs, &fd, kname); diff -r 5e184d4c01b8 -r e3accb15b1bb boot/bootx64.efi Binary file boot/bootx64.efi has changed diff -r 5e184d4c01b8 -r e3accb15b1bb boot/config.c --- a/boot/config.c Sun Feb 10 00:15:05 2013 +0900 +++ b/boot/config.c Mon Feb 11 04:30:42 2013 +0900 @@ -1,9 +1,11 @@ #include "bootx64.h" +#define FS_PRIVATE(n) (&(((fs_t *)n)->fs_priv.fs_data)) EFI_STATUS -open(fs_t *fs, EFI_FILE_HANDLE *fd, CHAR16 *name) +open(fs_interface_t *this, EFI_FILE_HANDLE *fd, CHAR16 *name) { + fs_state_t *fs = FS_PRIVATE(this); EFI_STATUS status; if (name == NULL || fd == NULL) return EFI_INVALID_PARAMETER; @@ -13,44 +15,33 @@ return status; } + EFI_STATUS -close(fs_t *fs, EFI_FILE_HANDLE *fd) +close(fs_interface_t *this, EFI_FILE_HANDLE *fd) { + fs_state_t *fs = FS_PRIVATE(this); if (fs == NULL || fd == NULL) return EFI_INVALID_PARAMETER; return uefi_call_wrapper(fs->volume->Close, 1, fd); } EFI_STATUS -read(fs_t *fs, EFI_FILE_HANDLE *fd, VOID *buf, UINTN *size) +read(fs_interface_t *this, EFI_FILE_HANDLE *fd, VOID *buf, UINTN *size) { + fs_state_t *fs = FS_PRIVATE(this); if (buf == NULL || fd == NULL || size == NULL) return EFI_INVALID_PARAMETER; return uefi_call_wrapper(fs->volume->Read, 3, fd, size, buf); } EFI_STATUS -seek(fs_t *fs, EFI_FILE_HANDLE *fd, UINTN newpos) +seek(fs_interface_t *this, EFI_FILE_HANDLE *fd, UINTN newpos) { + fs_state_t *fs = FS_PRIVATE(this); if (newpos <= 0 || fd == NULL || fs == NULL) return EFI_INVALID_PARAMETER; return uefi_call_wrapper(fs->volume->SetPosition, 2, *fd, newpos); } -EFI_STATUS -load(fs_t *fs, EFI_FILE_HANDLE *fd, CHAR16 *kname) -{ - VOID *buf = NULL; - UINTN size; - UINTN newpos = 0; - - - - - read(fs ,fd, buf, &size); - seek(fs ,fd, newpos); - - return EFI_SUCCESS; -} EFI_STATUS config_fs_one(EFI_HANDLE dev, VOID *fs) @@ -72,7 +63,7 @@ } Print(L"Open volume.\n"); - fs_t *fs_tmp = (fs_t *)fs; + fs_state_t *fs_tmp = (fs_state_t *)fs; SetMem(fs, sizeof(fs_t), 0); @@ -86,6 +77,8 @@ return EFI_SUCCESS; } + + EFI_STATUS config_fs(EFI_HANDLE boot_handle, fs_t *fs, dev_tab_t *boot_dev) { @@ -96,23 +89,25 @@ if (size == 0) return EFI_UNSUPPORTED; if (EFI_ERROR(status)) Print(L"efi unsupported. can not get handler.\n"); + size = 50 * sizeof(EFI_HANDLE); Print(L"find device, size=%d\n", size); - EFI_HANDLE *eh_tab = NULL; + dev_tab_t *dev_tab = NULL; /* alloc */ - status = uefi_call_wrapper(BS->AllocatePool, 3, EfiLoaderData, size, (VOID **)eh_tab); - if (EFI_NOT_FOUND != status) { + if (EFI_SUCCESS != status) { Print(L"can not allocate.\n"); return status; } - status = uefi_call_wrapper(BS->LocateHandle, 5, ByProtocol, &FileSystemProtocol, NULL, &size, (VOID **)eh_tab); + VOID *dev_tab = NULL; + + status = uefi_call_wrapper(BS->LocateHandle, 5, ByProtocol, &FileSystemProtocol, NULL, &size, (VOID **)dev_tab); if (EFI_NOT_FOUND == status) Print(L"EFI_NOT_FOUND\n"); if (EFI_BUFFER_TOO_SMALL == status) Print(L"EFI_BUFFER_TOO_SMALL.\n"); if (EFI_INVALID_PARAMETER == status) Print(L"EFI_INVALID_PARAMETER.\n"); if (EFI_ERROR(status)) { - Print(L"can not get handler.\n"); + Print(L"can not get handler. status :%d\n", (int)status); return status; } @@ -121,9 +116,8 @@ UINTN i; for (i = 0; i < ndev; i++) { VOID *fs = NULL; - //config_fs_one(eh_tab[i].dev, fs); + config_fs_one(dev_tab[i].dev, fs); //dev_tab[i].fs = fs; - config_fs_one(eh_tab[i], fs); } EFI_GUID proto = LOCALFS_PROTOCOL; @@ -152,7 +146,7 @@ for (i=0; i