Blame view

include/efi_loader.h 5.73 KB
cb149c663   Alexander Graf   efi_loader: Add P...
1
2
3
4
5
6
7
  /*
   *  EFI application loader
   *
   *  Copyright (c) 2016 Alexander Graf
   *
   *  SPDX-License-Identifier:     GPL-2.0+
   */
bee91169f   Alexander Graf   efi_loader: Add b...
8
  #include <common.h>
cb149c663   Alexander Graf   efi_loader: Add P...
9
10
  #include <part_efi.h>
  #include <efi_api.h>
bee91169f   Alexander Graf   efi_loader: Add b...
11
12
13
  
  /* No need for efi loader support in SPL */
  #if defined(CONFIG_EFI_LOADER) && !defined(CONFIG_SPL_BUILD)
cb149c663   Alexander Graf   efi_loader: Add P...
14
  #include <linux/list.h>
bee91169f   Alexander Graf   efi_loader: Add b...
15
16
  #define EFI_ENTRY(format, ...) do { \
  	efi_restore_gd(); \
edcef3ba1   Alexander Graf   efi_loader: Move ...
17
18
  	debug("EFI: Entry %s(" format ")
  ", __func__, ##__VA_ARGS__); \
bee91169f   Alexander Graf   efi_loader: Add b...
19
  	} while(0)
bee91169f   Alexander Graf   efi_loader: Add b...
20
21
  
  #define EFI_EXIT(ret) efi_exit_func(ret);
50149ea37   Alexander Graf   efi_loader: Add r...
22
  extern struct efi_runtime_services efi_runtime_services;
bee91169f   Alexander Graf   efi_loader: Add b...
23
  extern struct efi_system_table systab;
c1311ad4e   Alexander Graf   efi_loader: Add c...
24
25
26
27
28
  extern const struct efi_simple_text_output_protocol efi_con_out;
  extern const struct efi_simple_input_interface efi_con_in;
  extern const struct efi_console_control_protocol efi_console_control;
  
  extern const efi_guid_t efi_guid_console_control;
cb149c663   Alexander Graf   efi_loader: Add P...
29
30
  extern const efi_guid_t efi_guid_device_path;
  extern const efi_guid_t efi_guid_loaded_image;
50149ea37   Alexander Graf   efi_loader: Add r...
31
32
  extern unsigned int __efi_runtime_start, __efi_runtime_stop;
  extern unsigned int __efi_runtime_rel_start, __efi_runtime_rel_stop;
bee91169f   Alexander Graf   efi_loader: Add b...
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
  /*
   * While UEFI objects can have callbacks, you can also call functions on
   * protocols (classes) themselves. This struct maps a protocol GUID to its
   * interface (usually a struct with callback functions).
   */
  struct efi_class_map {
  	const efi_guid_t *guid;
  	const void *interface;
  };
  
  /*
   * When the UEFI payload wants to open a protocol on an object to get its
   * interface (usually a struct with callback functions), this struct maps the
   * protocol GUID to the respective protocol handler open function for that
   * object protocol combination.
   */
  struct efi_handler {
  	const efi_guid_t *guid;
  	efi_status_t (EFIAPI *open)(void *handle,
  			efi_guid_t *protocol, void **protocol_interface,
  			void *agent_handle, void *controller_handle,
  			uint32_t attributes);
  };
  
  /*
   * UEFI has a poor man's OO model where one "object" can be polymorphic and have
   * multiple different protocols (classes) attached to it.
   *
   * This struct is the parent struct for all of our actual implementation objects
   * that can include it to make themselves an EFI object
   */
  struct efi_object {
  	/* Every UEFI object is part of a global object list */
  	struct list_head link;
  	/* We support up to 4 "protocols" an object can be accessed through */
  	struct efi_handler protocols[4];
  	/* The object spawner can either use this for data or as identifier */
  	void *handle;
  };
  
  /* This list contains all UEFI objects we know of */
  extern struct list_head efi_obj_list;
2a22d05d3   Alexander Graf   efi_loader: Add d...
75
76
  /* Called by bootefi to make all disk storage accessible as EFI objects */
  int efi_disk_register(void);
be8d32419   Alexander Graf   efi_loader: Add G...
77
78
  /* Called by bootefi to make GOP (graphical) interface available */
  int efi_gop_register(void);
0efe1bcf5   Alexander Graf   efi_loader: Add n...
79
80
81
82
83
  /* Called by bootefi to make the network interface available */
  int efi_net_register(void **handle);
  
  /* Called by networking code to memorize the dhcp ack package */
  void efi_net_set_dhcp_ack(void *pkt, int len);
bee91169f   Alexander Graf   efi_loader: Add b...
84
85
86
87
  /*
   * Stub implementation for a protocol opener that just returns the handle as
   * interface
   */
cb149c663   Alexander Graf   efi_loader: Add P...
88
89
90
91
  efi_status_t efi_return_handle(void *handle,
  		efi_guid_t *protocol, void **protocol_interface,
  		void *agent_handle, void *controller_handle,
  		uint32_t attributes);
bee91169f   Alexander Graf   efi_loader: Add b...
92
93
94
  /* Called from places to check whether a timer expired */
  void efi_timer_check(void);
  /* PE loader implementation */
cb149c663   Alexander Graf   efi_loader: Add P...
95
  void *efi_load_pe(void *efi, struct efi_loaded_image *loaded_image_info);
bee91169f   Alexander Graf   efi_loader: Add b...
96
97
98
99
100
101
  /* Called once to store the pristine gd pointer */
  void efi_save_gd(void);
  /* Called from EFI_ENTRY on callback entry to put gd into the gd register */
  void efi_restore_gd(void);
  /* Called from EFI_EXIT on callback exit to restore the gd register */
  efi_status_t efi_exit_func(efi_status_t ret);
50149ea37   Alexander Graf   efi_loader: Add r...
102
103
  /* Call this to relocate the runtime section to an address space */
  void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map);
0f4060ebc   Alexander Graf   efi_loader: Pass ...
104
  /* Call this to set the current device name */
c07ad7c03   Alexander Graf   efi_loader: Pass ...
105
  void efi_set_bootdev(const char *dev, const char *devnr, const char *path);
50149ea37   Alexander Graf   efi_loader: Add r...
106

5d00995c3   Alexander Graf   efi_loader: Imple...
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
  /* Generic EFI memory allocator, call this to get memory */
  void *efi_alloc(uint64_t len, int memory_type);
  /* More specific EFI memory allocator, called by EFI payloads */
  efi_status_t efi_allocate_pages(int type, int memory_type, unsigned long pages,
  				uint64_t *memory);
  /* EFI memory free function. Not implemented today */
  efi_status_t efi_free_pages(uint64_t memory, unsigned long pages);
  /* Returns the EFI memory map */
  efi_status_t efi_get_memory_map(unsigned long *memory_map_size,
  				struct efi_mem_desc *memory_map,
  				unsigned long *map_key,
  				unsigned long *descriptor_size,
  				uint32_t *descriptor_version);
  /* Adds a range into the EFI memory map */
  uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
  			    bool overlap_only_ram);
  /* Called by board init to initialize the EFI memory map */
  int efi_memory_init(void);
51735ae0e   Alexander Graf   efi_loader: Add b...
125
126
127
128
  #ifdef CONFIG_EFI_LOADER_BOUNCE_BUFFER
  extern void *efi_bounce_buffer;
  #define EFI_LOADER_BOUNCE_BUFFER_SIZE (64 * 1024 * 1024)
  #endif
0f4060ebc   Alexander Graf   efi_loader: Pass ...
129
  /* Convert strings from normal C strings to uEFI strings */
487d756f7   Simon Glass   dm: efi: Update f...
130
  static inline void ascii2unicode(u16 *unicode, const char *ascii)
0f4060ebc   Alexander Graf   efi_loader: Pass ...
131
132
133
134
  {
  	while (*ascii)
  		*(unicode++) = *(ascii++);
  }
50149ea37   Alexander Graf   efi_loader: Add r...
135
136
137
138
139
140
  /*
   * Use these to indicate that your code / data should go into the EFI runtime
   * section and thus still be available when the OS is running
   */
  #define EFI_RUNTIME_DATA __attribute__ ((section ("efi_runtime_data")))
  #define EFI_RUNTIME_TEXT __attribute__ ((section ("efi_runtime_text")))
bee91169f   Alexander Graf   efi_loader: Add b...
141
142
  
  #else /* defined(EFI_LOADER) && !defined(CONFIG_SPL_BUILD) */
50149ea37   Alexander Graf   efi_loader: Add r...
143
144
145
  /* Without CONFIG_EFI_LOADER we don't have a runtime section, stub it out */
  #define EFI_RUNTIME_DATA
  #define EFI_RUNTIME_TEXT
bee91169f   Alexander Graf   efi_loader: Add b...
146
147
  /* No loader configured, stub out EFI_ENTRY */
  static inline void efi_restore_gd(void) { }
c07ad7c03   Alexander Graf   efi_loader: Pass ...
148
149
  static inline void efi_set_bootdev(const char *dev, const char *devnr,
  				   const char *path) { }
0efe1bcf5   Alexander Graf   efi_loader: Add n...
150
  static inline void efi_net_set_dhcp_ack(void *pkt, int len) { }
bee91169f   Alexander Graf   efi_loader: Add b...
151
152
  
  #endif