1c7ae3dfdSSimon Glass /* 2c7ae3dfdSSimon Glass * EFI hello world 3c7ae3dfdSSimon Glass * 4c7ae3dfdSSimon Glass * Copyright (c) 2016 Google, Inc 5c7ae3dfdSSimon Glass * Written by Simon Glass <sjg@chromium.org> 6c7ae3dfdSSimon Glass * 7c7ae3dfdSSimon Glass * SPDX-License-Identifier: GPL-2.0+ 8bbf75dd9SHeinrich Schuchardt * 9bbf75dd9SHeinrich Schuchardt * This program demonstrates calling a boottime service. 10bbf75dd9SHeinrich Schuchardt * It writes a greeting and the load options to the console. 11c7ae3dfdSSimon Glass */ 12c7ae3dfdSSimon Glass 13c7ae3dfdSSimon Glass #include <common.h> 14c7ae3dfdSSimon Glass #include <efi_api.h> 15c7ae3dfdSSimon Glass 16*ae67dca5SAlexander Graf static const efi_guid_t loaded_image_guid = LOADED_IMAGE_GUID; 17*ae67dca5SAlexander Graf 18bbf75dd9SHeinrich Schuchardt /* 19bbf75dd9SHeinrich Schuchardt * Entry point of the EFI application. 20bbf75dd9SHeinrich Schuchardt * 21bbf75dd9SHeinrich Schuchardt * @handle handle of the loaded image 22bbf75dd9SHeinrich Schuchardt * @systable system table 23bbf75dd9SHeinrich Schuchardt * @return status code 24bbf75dd9SHeinrich Schuchardt */ 25c7ae3dfdSSimon Glass efi_status_t EFIAPI efi_main(efi_handle_t handle, 26c7ae3dfdSSimon Glass struct efi_system_table *systable) 27c7ae3dfdSSimon Glass { 28c7ae3dfdSSimon Glass struct efi_simple_text_output_protocol *con_out = systable->con_out; 29c7ae3dfdSSimon Glass struct efi_boot_services *boottime = systable->boottime; 30bbf75dd9SHeinrich Schuchardt struct efi_loaded_image *loaded_image; 31bbf75dd9SHeinrich Schuchardt efi_status_t ret; 32c7ae3dfdSSimon Glass 33c7ae3dfdSSimon Glass con_out->output_string(con_out, L"Hello, world!\n"); 34c7ae3dfdSSimon Glass 35bbf75dd9SHeinrich Schuchardt /* Get the loaded image protocol */ 36bbf75dd9SHeinrich Schuchardt ret = boottime->handle_protocol(handle, &loaded_image_guid, 37bbf75dd9SHeinrich Schuchardt (void **)&loaded_image); 38bbf75dd9SHeinrich Schuchardt if (ret != EFI_SUCCESS) { 39bbf75dd9SHeinrich Schuchardt con_out->output_string(con_out, 40bbf75dd9SHeinrich Schuchardt L"Cannot open loaded image protocol\n"); 41bbf75dd9SHeinrich Schuchardt goto out; 42bbf75dd9SHeinrich Schuchardt } 43bbf75dd9SHeinrich Schuchardt /* Output the load options */ 44bbf75dd9SHeinrich Schuchardt con_out->output_string(con_out, L"Load options: "); 45bbf75dd9SHeinrich Schuchardt if (loaded_image->load_options_size && loaded_image->load_options) 46bbf75dd9SHeinrich Schuchardt con_out->output_string(con_out, 47bbf75dd9SHeinrich Schuchardt (u16 *)loaded_image->load_options); 48bbf75dd9SHeinrich Schuchardt else 49bbf75dd9SHeinrich Schuchardt con_out->output_string(con_out, L"<none>"); 50bbf75dd9SHeinrich Schuchardt con_out->output_string(con_out, L"\n"); 51bbf75dd9SHeinrich Schuchardt 52bbf75dd9SHeinrich Schuchardt out: 53bbf75dd9SHeinrich Schuchardt boottime->exit(handle, ret, 0, NULL); 54bbf75dd9SHeinrich Schuchardt 55bbf75dd9SHeinrich Schuchardt /* We should never arrive here */ 56bbf75dd9SHeinrich Schuchardt return ret; 57c7ae3dfdSSimon Glass } 58