changeset 21:e3accb15b1bb default tip

add alloc and loader.
author taiki
date Mon, 11 Feb 2013 04:30:42 +0900
parents 5e184d4c01b8
children
files boot/alloc.c boot/bootx64.c boot/bootx64.efi boot/config.c boot/loader.c
diffstat 5 files changed, 46 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- /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;
+}
--- 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);
 
Binary file boot/bootx64.efi has changed
--- 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<size; i++) { 
         //dev_tab[idx].dev = tab[i];
-        eh_tab[idx] = tab[i];
+        dev_tab[idx].dev = tab[i];
         // if (tab[i] == boot_handle) boot_dev = eh_tab + idx;
         idx++;
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/boot/loader.c	Mon Feb 11 04:30:42 2013 +0900
@@ -0,0 +1,13 @@
+
+EFI_STATUS
+load(fs_interface_t *this, EFI_FILE_HANDLE *fd, CHAR16 *kname)
+{
+    VOID *buf;
+    UINTN size;
+    UINTN newpos = 0;
+    buf = NULL;
+    read(this ,fd, buf, &size);
+    seek(this ,fd, newpos);
+
+    return EFI_SUCCESS;
+}