iPXE
Macros | Functions | Variables
runtime.c File Reference

Command line and initrd passed to iPXE at runtime. More...

#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <assert.h>
#include <ipxe/init.h>
#include <ipxe/image.h>
#include <ipxe/script.h>
#include <ipxe/umalloc.h>
#include <realmode.h>

Go to the source code of this file.

Macros

#define cmdline_phys   __use_data16 ( cmdline_phys )
 
#define initrd_phys   __use_data16 ( initrd_phys )
 
#define initrd_len   __use_data16 ( initrd_len )
 
#define colour   &cmdline_image
 Colour for debug messages. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
uint32_t __bss16 (cmdline_phys)
 Command line physical address. More...
 
uint32_t __bss16 (initrd_phys)
 initrd physical address More...
 
uint32_t __bss16 (initrd_len)
 initrd length More...
 
static void cmdline_image_free (struct refcnt *refcnt)
 Free command line image. More...
 
static void cmdline_strip (char *cmdline, const char *cruft)
 Strip unwanted cruft from command line. More...
 
static int cmdline_init (void)
 Initialise command line. More...
 
static int initrd_init (void)
 Initialise initrd. More...
 
static void runtime_init (void)
 Initialise command line and initrd. More...
 
struct startup_fn runtime_startup_fn __startup_fn (STARTUP_NORMAL)
 Command line and initrd initialisation function. More...
 

Variables

static char * cmdline_copy
 Internal copy of the command line. More...
 
static struct image cmdline_image
 Embedded script representing the command line. More...
 

Detailed Description

Command line and initrd passed to iPXE at runtime.

Definition in file runtime.c.

Macro Definition Documentation

◆ cmdline_phys

#define cmdline_phys   __use_data16 ( cmdline_phys )

Definition at line 49 of file runtime.c.

◆ initrd_phys

#define initrd_phys   __use_data16 ( initrd_phys )

Definition at line 56 of file runtime.c.

◆ initrd_len

#define initrd_len   __use_data16 ( initrd_len )

Definition at line 63 of file runtime.c.

◆ colour

#define colour   &cmdline_image

Colour for debug messages.

Definition at line 84 of file runtime.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ __bss16() [1/3]

uint32_t __bss16 ( cmdline_phys  )

Command line physical address.

This can be set by the prefix.

◆ __bss16() [2/3]

uint32_t __bss16 ( initrd_phys  )

initrd physical address

This can be set by the prefix.

◆ __bss16() [3/3]

uint32_t __bss16 ( initrd_len  )

initrd length

This can be set by the prefix.

◆ cmdline_image_free()

static void cmdline_image_free ( struct refcnt refcnt)
static

Free command line image.

Definition at line 69 of file runtime.c.

69  {
70  struct image *image = container_of ( refcnt, struct image, refcnt );
71 
72  DBGC ( image, "RUNTIME freeing command line\n" );
73  free ( cmdline_copy );
74 }
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:24
A reference counter.
Definition: refcnt.h:26
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
static char * cmdline_copy
Internal copy of the command line.
Definition: runtime.c:66

References cmdline_copy, container_of, DBGC, and free.

◆ cmdline_strip()

static void cmdline_strip ( char *  cmdline,
const char *  cruft 
)
static

Strip unwanted cruft from command line.

Parameters
cmdlineCommand line
cruftInitial substring of cruft to strip

Definition at line 92 of file runtime.c.

92  {
93  char *strip;
94  char *strip_end;
95 
96  /* Find unwanted cruft, if present */
97  if ( ! ( strip = strstr ( cmdline, cruft ) ) )
98  return;
99 
100  /* Strip unwanted cruft */
101  strip_end = strchr ( strip, ' ' );
102  if ( strip_end ) {
103  *strip_end = '\0';
104  DBGC ( colour, "RUNTIME stripping \"%s\"\n", strip );
105  strcpy ( strip, ( strip_end + 1 ) );
106  } else {
107  DBGC ( colour, "RUNTIME stripping \"%s\"\n", strip );
108  *strip = '\0';
109  }
110 }
#define DBGC(...)
Definition: compiler.h:505
char * strstr(const char *haystack, const char *needle)
Find substring.
Definition: string.c:279
char * strcpy(char *dest, const char *src)
Copy string.
Definition: string.c:296
char * strchr(const char *src, int character)
Find character within a string.
Definition: string.c:241
uint32_t cmdline
Definition: multiboot.h:16
#define colour
Colour for debug messages.
Definition: runtime.c:84

References cmdline, colour, DBGC, strchr(), strcpy(), and strstr().

Referenced by cmdline_init().

◆ cmdline_init()

static int cmdline_init ( void  )
static

Initialise command line.

Return values
rcReturn status code

Definition at line 117 of file runtime.c.

117  {
118  userptr_t cmdline_user;
119  char *cmdline;
120  size_t len;
121  int rc;
122 
123  /* Do nothing if no command line was specified */
124  if ( ! cmdline_phys ) {
125  DBGC ( colour, "RUNTIME found no command line\n" );
126  return 0;
127  }
128  cmdline_user = phys_to_user ( cmdline_phys );
129  len = ( strlen_user ( cmdline_user, 0 ) + 1 /* NUL */ );
130 
131  /* Allocate and copy command line */
132  cmdline_copy = malloc ( len );
133  if ( ! cmdline_copy ) {
134  DBGC ( colour, "RUNTIME could not allocate %zd bytes for "
135  "command line\n", len );
136  rc = -ENOMEM;
137  goto err_alloc_cmdline_copy;
138  }
140  copy_from_user ( cmdline, cmdline_user, 0, len );
141  DBGC ( colour, "RUNTIME found command line \"%s\" at %08x\n",
143 
144  /* Mark command line as consumed */
145  cmdline_phys = 0;
146 
147  /* Strip unwanted cruft from the command line */
148  cmdline_strip ( cmdline, "BOOT_IMAGE=" );
149  cmdline_strip ( cmdline, "initrd=" );
150  while ( isspace ( *cmdline ) )
151  cmdline++;
152  DBGC ( colour, "RUNTIME using command line \"%s\"\n", cmdline );
153 
154  /* Prepare and register image */
157  if ( cmdline_image.len ) {
158  if ( ( rc = register_image ( &cmdline_image ) ) != 0 ) {
159  DBGC ( colour, "RUNTIME could not register command "
160  "line: %s\n", strerror ( rc ) );
161  goto err_register_image;
162  }
163  }
164 
165  /* Drop our reference to the image */
167 
168  return 0;
169 
170  err_register_image:
172  err_alloc_cmdline_copy:
173  return rc;
174 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
userptr_t data
Raw file image.
Definition: image.h:41
static __always_inline void copy_from_user(void *dest, userptr_t src, off_t src_off, size_t len)
Copy data from user buffer.
Definition: uaccess.h:337
#define DBGC(...)
Definition: compiler.h:505
userptr_t phys_to_user(unsigned long phys_addr)
Convert physical address to user pointer.
#define cmdline_phys
Definition: runtime.c:49
#define ENOMEM
Not enough space.
Definition: errno.h:534
int register_image(struct image *image)
Register executable image.
Definition: image.c:210
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
size_t len
Length of raw file image.
Definition: image.h:43
int isspace(int character)
Check to see if character is a space.
Definition: ctype.c:41
size_t strlen(const char *src)
Get length of string.
Definition: string.c:213
static void image_put(struct image *image)
Decrement reference count on an image.
Definition: image.h:206
void * malloc(size_t size)
Allocate memory.
Definition: malloc.c:583
static struct image cmdline_image
Embedded script representing the command line.
Definition: runtime.c:77
static void cmdline_strip(char *cmdline, const char *cruft)
Strip unwanted cruft from command line.
Definition: runtime.c:92
size_t strlen_user(userptr_t userptr, off_t offset)
Find length of NUL-terminated string in user buffer.
uint32_t len
Length.
Definition: ena.h:14
userptr_t virt_to_user(volatile const void *addr)
Convert virtual address to user pointer.
uint32_t cmdline
Definition: multiboot.h:16
static char * cmdline_copy
Internal copy of the command line.
Definition: runtime.c:66
#define colour
Colour for debug messages.
Definition: runtime.c:84
unsigned long userptr_t
A pointer to a user buffer.
Definition: uaccess.h:33

References cmdline, cmdline_copy, cmdline_image, cmdline_phys, cmdline_strip(), colour, copy_from_user(), image::data, DBGC, ENOMEM, image_put(), isspace(), len, image::len, malloc(), phys_to_user(), rc, register_image(), strerror(), strlen(), strlen_user(), and virt_to_user().

Referenced by runtime_init().

◆ initrd_init()

static int initrd_init ( void  )
static

Initialise initrd.

Return values
rcReturn status code

Definition at line 181 of file runtime.c.

181  {
182  struct image *image;
183  int rc;
184 
185  /* Do nothing if no initrd was specified */
186  if ( ! initrd_phys ) {
187  DBGC ( colour, "RUNTIME found no initrd\n" );
188  return 0;
189  }
190  if ( ! initrd_len ) {
191  DBGC ( colour, "RUNTIME found empty initrd\n" );
192  return 0;
193  }
194  DBGC ( colour, "RUNTIME found initrd at [%x,%x)\n",
196 
197  /* Allocate image */
198  image = alloc_image ( NULL );
199  if ( ! image ) {
200  DBGC ( colour, "RUNTIME could not allocate image for "
201  "initrd\n" );
202  rc = -ENOMEM;
203  goto err_alloc_image;
204  }
205  if ( ( rc = image_set_name ( image, "<INITRD>" ) ) != 0 ) {
206  DBGC ( colour, "RUNTIME could not set image name: %s\n",
207  strerror ( rc ) );
208  goto err_set_name;
209  }
210 
211  /* Allocate and copy initrd content */
212  image->data = umalloc ( initrd_len );
213  if ( ! image->data ) {
214  DBGC ( colour, "RUNTIME could not allocate %d bytes for "
215  "initrd\n", initrd_len );
216  rc = -ENOMEM;
217  goto err_umalloc;
218  }
219  image->len = initrd_len;
221  initrd_len );
222 
223  /* Mark initrd as consumed */
224  initrd_phys = 0;
225 
226  /* Register image */
227  if ( ( rc = register_image ( image ) ) != 0 ) {
228  DBGC ( colour, "RUNTIME could not register initrd: %s\n",
229  strerror ( rc ) );
230  goto err_register_image;
231  }
232 
233  /* Drop our reference to the image */
234  image_put ( image );
235 
236  return 0;
237 
238  err_register_image:
239  err_umalloc:
240  err_set_name:
241  image_put ( image );
242  err_alloc_image:
243  return rc;
244 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
userptr_t data
Raw file image.
Definition: image.h:41
#define DBGC(...)
Definition: compiler.h:505
userptr_t phys_to_user(unsigned long phys_addr)
Convert physical address to user pointer.
An executable image.
Definition: image.h:24
#define ENOMEM
Not enough space.
Definition: errno.h:534
int register_image(struct image *image)
Register executable image.
Definition: image.c:210
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
size_t len
Length of raw file image.
Definition: image.h:43
int image_set_name(struct image *image, const char *name)
Set image name.
Definition: image.c:144
static void image_put(struct image *image)
Decrement reference count on an image.
Definition: image.h:206
static __always_inline userptr_t umalloc(size_t size)
Allocate external memory.
Definition: umalloc.h:54
#define initrd_phys
Definition: runtime.c:56
struct image * alloc_image(struct uri *uri)
Allocate executable image.
Definition: image.c:90
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
#define colour
Colour for debug messages.
Definition: runtime.c:84
void memcpy_user(userptr_t dest, off_t dest_off, userptr_t src, off_t src_off, size_t len)
Copy data between user buffers.
#define initrd_len
Definition: runtime.c:63

References alloc_image(), colour, image::data, DBGC, ENOMEM, image_put(), image_set_name(), initrd_len, initrd_phys, image::len, memcpy_user(), NULL, phys_to_user(), rc, register_image(), strerror(), and umalloc().

Referenced by runtime_init().

◆ runtime_init()

static void runtime_init ( void  )
static

Initialise command line and initrd.

Definition at line 250 of file runtime.c.

250  {
251  int rc;
252 
253  /* Initialise command line */
254  if ( ( rc = cmdline_init() ) != 0 ) {
255  /* No way to report failure */
256  return;
257  }
258 
259  /* Initialise initrd */
260  if ( ( rc = initrd_init() ) != 0 ) {
261  /* No way to report failure */
262  return;
263  }
264 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int cmdline_init(void)
Initialise command line.
Definition: runtime.c:117
static int initrd_init(void)
Initialise initrd.
Definition: runtime.c:181

References cmdline_init(), initrd_init(), and rc.

◆ __startup_fn()

struct startup_fn runtime_startup_fn __startup_fn ( STARTUP_NORMAL  )

Command line and initrd initialisation function.

Variable Documentation

◆ cmdline_copy

char* cmdline_copy
static

Internal copy of the command line.

Definition at line 66 of file runtime.c.

Referenced by cmdline_image_free(), and cmdline_init().

◆ cmdline_image

struct image cmdline_image
static
Initial value:
= {
.name = "<CMDLINE>",
.type = &script_image_type,
}
#define REF_INIT(free_fn)
Initialise a static reference counter.
Definition: refcnt.h:77
static void cmdline_image_free(struct refcnt *refcnt)
Free command line image.
Definition: runtime.c:69

Embedded script representing the command line.

Definition at line 77 of file runtime.c.

Referenced by cmdline_init().