EFI_CONSOLE_CONTROL_PROTOCOL structs in console_text_mode() should be declared...
[platform/upstream/gummiboot.git] / src / efi / gummiboot.c
index 0a5ab29..ecba84f 100644 (file)
@@ -76,6 +76,7 @@ typedef struct {
         UINTN timeout_sec_config;
         INTN timeout_sec_efivar;
         CHAR16 *entry_default_pattern;
+        CHAR16 *entry_oneshot;
         CHAR16 *options_edit;
         CHAR16 *entries_auto;
 } Config;
@@ -196,7 +197,7 @@ static EFI_STATUS efivar_set_raw(const EFI_GUID *vendor, CHAR16 *name, CHAR8 *bu
         if (persistent)
                 flags |= EFI_VARIABLE_NON_VOLATILE;
 
-        return uefi_call_wrapper(RT->SetVariable, 5, name, vendor, flags, size, buf);
+        return uefi_call_wrapper(RT->SetVariable, 5, name, (EFI_GUID *)vendor, flags, size, buf);
 }
 
 static EFI_STATUS efivar_set(CHAR16 *name, CHAR16 *value, BOOLEAN persistent) {
@@ -213,7 +214,7 @@ static EFI_STATUS efivar_get_raw(const EFI_GUID *vendor, CHAR16 *name, CHAR8 **b
         if (!buf)
                 return EFI_OUT_OF_RESOURCES;
 
-        err = uefi_call_wrapper(RT->GetVariable, 5, name, vendor, NULL, &l, buf);
+        err = uefi_call_wrapper(RT->GetVariable, 5, name, (EFI_GUID *)vendor, NULL, &l, buf);
         if (EFI_ERROR(err) == EFI_SUCCESS) {
                 *buffer = buf;
                 if (size)
@@ -503,10 +504,8 @@ static VOID dump_status(Config *config, CHAR16 *loaded_image_path) {
 
         if (efivar_get_int(L"LoaderConfigTimeout", &i) == EFI_SUCCESS)
                 Print(L"LoaderConfigTimeout:    %d\n", i);
-        if (efivar_get(L"LoaderEntryOneShot", &s) == EFI_SUCCESS) {
-                Print(L"LoaderEntryOneShot:     %s\n", s);
-                FreePool(s);
-        }
+        if (config->entry_oneshot)
+                Print(L"LoaderEntryOneShot:     %s\n", config->entry_oneshot);
         if (efivar_get(L"LoaderDeviceIdentifier", &s) == EFI_SUCCESS) {
                 Print(L"LoaderDeviceIdentifier: %s\n", s);
                 FreePool(s);
@@ -576,19 +575,19 @@ static EFI_STATUS console_text_mode(VOID) {
                 EfiConsoleControlScreenMaxValue,
         } EFI_CONSOLE_CONTROL_SCREEN_MODE;
 
-        typedef EFI_STATUS (*EFI_CONSOLE_CONTROL_PROTOCOL_GET_MODE)(
+        typedef EFI_STATUS (EFIAPI *EFI_CONSOLE_CONTROL_PROTOCOL_GET_MODE)(
                 struct _EFI_CONSOLE_CONTROL_PROTOCOL *This,
                 EFI_CONSOLE_CONTROL_SCREEN_MODE *Mode,
                 BOOLEAN *UgaExists,
                 BOOLEAN *StdInLocked
         );
 
-        typedef EFI_STATUS (*EFI_CONSOLE_CONTROL_PROTOCOL_SET_MODE)(
+        typedef EFI_STATUS (EFIAPI *EFI_CONSOLE_CONTROL_PROTOCOL_SET_MODE)(
                 struct _EFI_CONSOLE_CONTROL_PROTOCOL *This,
                 EFI_CONSOLE_CONTROL_SCREEN_MODE Mode
         );
 
-        typedef EFI_STATUS (*EFI_CONSOLE_CONTROL_PROTOCOL_LOCK_STD_IN)(
+        typedef EFI_STATUS (EFIAPI *EFI_CONSOLE_CONTROL_PROTOCOL_LOCK_STD_IN)(
                 struct _EFI_CONSOLE_CONTROL_PROTOCOL *This,
                 CHAR16 *Password
         );
@@ -770,7 +769,7 @@ static BOOLEAN menu_run(Config *config, ConfigEntry **chosen_entry, CHAR16 *load
                 }
 
                 err = uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, &key);
-                if (err == EFI_NOT_READY) {
+                if (err != EFI_SUCCESS) {
                         UINTN index;
 
                         if (timeout_remain == 0) {
@@ -1388,7 +1387,7 @@ static VOID config_entry_add_from_file(Config *config, EFI_HANDLE *device, CHAR1
         config_add_entry(config, entry);
 }
 
-static UINTN file_read(EFI_FILE_HANDLE dir, const CHAR16 *name, CHAR8 **content) {
+static UINTN file_read(EFI_FILE_HANDLE dir, CHAR16 *name, CHAR8 **content) {
         EFI_FILE_HANDLE handle;
         EFI_FILE_INFO *info;
         CHAR8 *buf;
@@ -1512,6 +1511,8 @@ static VOID config_default_entry_select(Config *config) {
                                 break;
                         }
                 }
+
+                config->entry_oneshot = StrDuplicate(var);
                 efivar_set(L"LoaderEntryOneShot", NULL, TRUE);
                 FreePool(var);
                 if (found)
@@ -1792,7 +1793,7 @@ static EFI_STATUS image_start(EFI_HANDLE parent_image, const Config *config, con
         if (options) {
                 EFI_LOADED_IMAGE *loaded_image;
 
-                err = uefi_call_wrapper(BS->OpenProtocol, 6, image, &LoadedImageProtocol, &loaded_image,
+                err = uefi_call_wrapper(BS->OpenProtocol, 6, image, &LoadedImageProtocol, (void **)&loaded_image,
                                         parent_image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
                 if (EFI_ERROR(err)) {
                         Print(L"Error getting LoadedImageProtocol handle: %r", err);
@@ -1843,10 +1844,11 @@ static VOID config_free(Config *config) {
         FreePool(config->entries);
         FreePool(config->entry_default_pattern);
         FreePool(config->options_edit);
+        FreePool(config->entry_oneshot);
         FreePool(config->entries_auto);
 }
 
-EFI_STATUS EFIAPI efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
+EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
         CHAR16 *s;
         CHAR8 *b;
         UINTN size;
@@ -1870,7 +1872,7 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
         efivar_set(L"LoaderFirmwareType", s, FALSE);
         FreePool(s);
 
-        err = uefi_call_wrapper(BS->OpenProtocol, 6, image, &LoadedImageProtocol, &loaded_image,
+        err = uefi_call_wrapper(BS->OpenProtocol, 6, image, &LoadedImageProtocol, (void **)&loaded_image,
                                 image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
         if (EFI_ERROR(err)) {
                 Print(L"Error getting a LoadedImageProtocol handle: %r ", err);
@@ -1964,7 +1966,7 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
                 EFI_INPUT_KEY key;
 
                 err = uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, &key);
-                if (err != EFI_NOT_READY)
+                if (err == EFI_SUCCESS)
                         menu = TRUE;
         } else
                 menu = TRUE;