iPXE
Macros | Functions | Variables
segment.c File Reference

Executable image segments. More...

#include <errno.h>
#include <ipxe/uaccess.h>
#include <ipxe/io.h>
#include <ipxe/errortab.h>
#include <ipxe/segment.h>

Go to the source code of this file.

Macros

#define ERANGE_SEGMENT   __einfo_error ( EINFO_ERANGE_SEGMENT )
 Segment-specific error messages. More...
 
#define EINFO_ERANGE_SEGMENT   __einfo_uniqify ( EINFO_ERANGE, 0x01, "Requested memory not available" )
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
int prep_segment (userptr_t segment, size_t filesz, size_t memsz)
 Prepare segment for loading. More...
 

Variables

struct errortab segment_errors [] __errortab
 

Detailed Description

Executable image segments.

Definition in file segment.c.

Macro Definition Documentation

◆ ERANGE_SEGMENT

#define ERANGE_SEGMENT   __einfo_error ( EINFO_ERANGE_SEGMENT )

Segment-specific error messages.

This error happens sufficiently often to merit a user-friendly description.

Definition at line 45 of file segment.c.

◆ EINFO_ERANGE_SEGMENT

#define EINFO_ERANGE_SEGMENT   __einfo_uniqify ( EINFO_ERANGE, 0x01, "Requested memory not available" )

Definition at line 46 of file segment.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ prep_segment()

int prep_segment ( userptr_t  segment,
size_t  filesz,
size_t  memsz 
)

Prepare segment for loading.

Parameters
segmentSegment start
fileszSize of the "allocated bytes" portion of the segment
memszSize of the segment
Return values
rcReturn status code

Definition at line 60 of file segment.c.

60  {
61  struct memory_map memmap;
63  physaddr_t mid = user_to_phys ( segment, filesz );
64  physaddr_t end = user_to_phys ( segment, memsz );
65  unsigned int i;
66 
67  DBG ( "Preparing segment [%lx,%lx,%lx)\n", start, mid, end );
68 
69  /* Sanity check */
70  if ( filesz > memsz ) {
71  DBG ( "Insane segment [%lx,%lx,%lx)\n", start, mid, end );
72  return -EINVAL;
73  }
74 
75  /* Get a fresh memory map. This allows us to automatically
76  * avoid treading on any regions that Etherboot is currently
77  * editing out of the memory map.
78  */
79  get_memmap ( &memmap );
80 
81  /* Look for a suitable memory region */
82  for ( i = 0 ; i < memmap.count ; i++ ) {
83  if ( ( start >= memmap.regions[i].start ) &&
84  ( end <= memmap.regions[i].end ) ) {
85  /* Found valid region: zero bss and return */
86  memset_user ( segment, filesz, 0, ( memsz - filesz ) );
87  return 0;
88  }
89  }
90 
91  /* No suitable memory region found */
92  DBG ( "Segment [%lx,%lx,%lx) does not fit into available memory\n",
93  start, mid, end );
94  return -ERANGE_SEGMENT;
95 }
#define EINVAL
Invalid argument.
Definition: errno.h:428
uint16_t segment
Code segment.
Definition: librm.h:252
void get_memmap(struct memory_map *memmap)
Get memory map.
uint16_t mid
Middle 16 bits of address.
Definition: librm.h:258
unsigned long user_to_phys(userptr_t userptr, off_t offset)
Convert user pointer to physical address.
A memory map.
Definition: io.h:499
uint32_t start
Starting offset.
Definition: netvsc.h:12
void memset_user(userptr_t userptr, off_t offset, int c, size_t len)
Fill user buffer with a constant byte.
#define ERANGE_SEGMENT
Segment-specific error messages.
Definition: segment.c:45
unsigned long physaddr_t
Definition: stdint.h:20
uint32_t end
Ending offset.
Definition: netvsc.h:18
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498

References memory_map::count, DBG, EINVAL, end, memory_region::end, ERANGE_SEGMENT, get_memmap(), memset_user(), mid, memory_map::regions, segment, start, memory_region::start, and user_to_phys().

Referenced by bzimage_exec(), com32_load_image(), com32_prepare_bounce_buffer(), comboot_prepare_segment(), elf_load_segment(), multiboot_add_modules(), multiboot_load_raw(), nbi_prepare_segment(), and pxe_exec().

Variable Documentation

◆ __errortab

struct errortab segment_errors [] __errortab
Initial value:
= {
}
#define __einfo_errortab(einfo)
Definition: errortab.h:23
#define EINFO_ERANGE_SEGMENT
Definition: segment.c:46

Definition at line 48 of file segment.c.