iPXE
Macros | Functions | Variables
memmap_settings.c File Reference

Memory map settings. More...

#include <string.h>
#include <errno.h>
#include <byteswap.h>
#include <ipxe/init.h>
#include <ipxe/settings.h>
#include <ipxe/memmap.h>

Go to the source code of this file.

Macros

#define MEMMAP_TAG(start, count, include_start, include_length, ignore, scale)
 Construct memory map setting tag. More...
 
#define MEMMAP_COUNT(tag)   ( ( ( (tag) >> 24 ) & 0xff ) + 1 )
 Extract number of regions from setting tag. More...
 
#define MEMMAP_START(tag)   ( ( (tag) >> 16 ) & 0xff )
 Extract starting region from setting tag. More...
 
#define MEMMAP_IGNORE_NONEXISTENT(tag)   ( (tag) & 0x00000400UL )
 Extract ignore flag from setting tag. More...
 
#define MEMMAP_INCLUDE_LENGTH(tag)   ( (tag) & 0x00000200UL )
 Extract length inclusion flag from setting tag. More...
 
#define MEMMAP_INCLUDE_START(tag)   ( (tag) & 0x00000100UL )
 Extract start address inclusion flag from setting tag. More...
 
#define MEMMAP_SCALE(tag)   ( (tag) & 0x3f )
 Extract scale factor from setting tag. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static int memmap_settings_applies (struct settings *settings __unused, const struct setting *setting)
 Check applicability of memory map setting. More...
 
static int memmap_settings_fetch (struct settings *settings, struct setting *setting, void *data, size_t len)
 Fetch value of memory map setting. More...
 
static void memmap_settings_init (void)
 Initialise memory map settings. More...
 
struct init_fn memmap_settings_init_fn __init_fn (INIT_NORMAL)
 Memory map settings initialiser. More...
 
const struct setting memsize_setting __setting (SETTING_MISC, memsize)
 Memory map predefined settings. More...
 

Variables

static const struct settings_scope memmap_settings_scope
 Memory map settings scope. More...
 
static struct settings_operations memmap_settings_operations
 Memory map settings operations. More...
 
static struct settings memmap_settings
 Memory map settings. More...
 

Detailed Description

Memory map settings.

Memory map settings are numerically encoded as:

Bits 31-24 Number of regions, minus one Bits 23-16 Starting region Bits 15-11 Unused Bit 10 Ignore non-existent regions (rather than generating an error) Bit 9 Include length Bit 8 Include start address Bits 7-6 Unused Bits 5-0 Scale factor (i.e. right shift count)

Definition in file memmap_settings.c.

Macro Definition Documentation

◆ MEMMAP_TAG

#define MEMMAP_TAG (   start,
  count,
  include_start,
  include_length,
  ignore,
  scale 
)
Value:
( ( (start) << 16 ) | ( ( (count) - 1 ) << 24 ) | \
( (ignore) << 10 ) | ( (include_length) << 9 ) | \
( (include_start) << 8 ) | (scale) )
uint32_t start
Starting offset.
Definition: netvsc.h:12
static unsigned int count
Number of entries.
Definition: dwmac.h:225

Construct memory map setting tag.

Parameters
startStarting region
countNumber of regions
include_startInclude start address
include_lengthInclude length
ignoreIgnore non-existent regions
scaleScale factor
Return values
tagSetting tag

Definition at line 60 of file memmap_settings.c.

◆ MEMMAP_COUNT

#define MEMMAP_COUNT (   tag)    ( ( ( (tag) >> 24 ) & 0xff ) + 1 )

Extract number of regions from setting tag.

Parameters
tagSetting tag
Return values
countNumber of regions

Definition at line 72 of file memmap_settings.c.

◆ MEMMAP_START

#define MEMMAP_START (   tag)    ( ( (tag) >> 16 ) & 0xff )

Extract starting region from setting tag.

Parameters
tagSetting tag
Return values
startStarting region

Definition at line 80 of file memmap_settings.c.

◆ MEMMAP_IGNORE_NONEXISTENT

#define MEMMAP_IGNORE_NONEXISTENT (   tag)    ( (tag) & 0x00000400UL )

Extract ignore flag from setting tag.

Parameters
tagSetting tag
Return values
ignoreIgnore non-existent regions

Definition at line 88 of file memmap_settings.c.

◆ MEMMAP_INCLUDE_LENGTH

#define MEMMAP_INCLUDE_LENGTH (   tag)    ( (tag) & 0x00000200UL )

Extract length inclusion flag from setting tag.

Parameters
tagSetting tag
Return values
include_lengthInclude length

Definition at line 96 of file memmap_settings.c.

◆ MEMMAP_INCLUDE_START

#define MEMMAP_INCLUDE_START (   tag)    ( (tag) & 0x00000100UL )

Extract start address inclusion flag from setting tag.

Parameters
tagSetting tag
Return values
include_startInclude start address

Definition at line 104 of file memmap_settings.c.

◆ MEMMAP_SCALE

#define MEMMAP_SCALE (   tag)    ( (tag) & 0x3f )

Extract scale factor from setting tag.

Parameters
tagSetting tag
scaleScale factor

Definition at line 112 of file memmap_settings.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ memmap_settings_applies()

static int memmap_settings_applies ( struct settings *settings  __unused,
const struct setting setting 
)
static

Check applicability of memory map setting.

Parameters
settingsSettings block
settingSetting
Return values
appliesSetting applies within this settings block

Definition at line 124 of file memmap_settings.c.

125  {
126 
127  return ( setting->scope == &memmap_settings_scope );
128 }
static const struct settings_scope memmap_settings_scope
Memory map settings scope.
A setting.
Definition: settings.h:23
const struct settings_scope * scope
Setting scope (or NULL)
Definition: settings.h:49

References memmap_settings_scope, and setting::scope.

◆ memmap_settings_fetch()

static int memmap_settings_fetch ( struct settings settings,
struct setting setting,
void *  data,
size_t  len 
)
static

Fetch value of memory map setting.

Parameters
settingsSettings block
settingSetting to fetch
dataBuffer to fill with setting data
lenLength of buffer
Return values
lenLength of setting data, or negative error

Definition at line 139 of file memmap_settings.c.

141  {
142  struct memmap_region region;
143  uint64_t result = 0;
144  unsigned int index = 0;
145  unsigned int start;
146  unsigned int count;
147  unsigned int scale;
148  int include_start;
149  int include_length;
150  int ignore_nonexistent;
151 
152  /* Parse settings tag */
153  start = MEMMAP_START ( setting->tag );
154  count = MEMMAP_COUNT ( setting->tag );
155  scale = MEMMAP_SCALE ( setting->tag );
156  include_start = MEMMAP_INCLUDE_START ( setting->tag );
157  include_length = MEMMAP_INCLUDE_LENGTH ( setting->tag );
158  ignore_nonexistent = MEMMAP_IGNORE_NONEXISTENT ( setting->tag );
159  DBGC ( settings, "MEMMAP start %d count %d %s%s%s%s scale %d\n",
160  start, count, ( include_start ? "start" : "" ),
161  ( ( include_start && include_length ) ? "+" : "" ),
162  ( include_length ? "length" : "" ),
163  ( ignore_nonexistent ? " ignore" : "" ), scale );
164 
165  /* Extract results from memory map */
166  for_each_memmap ( &region, 0 ) {
167 
168  /* Skip non-memory regions */
169  if ( ! ( region.flags & MEMMAP_FL_MEMORY ) )
170  continue;
171 
172  /* Ignore unwanted regions */
173  if ( index++ < start )
174  continue;
175 
176  /* Extract results from this region */
177  if ( include_start ) {
178  result += region.min;
179  DBGC ( settings, "MEMMAP %d start %#08llx\n", index,
180  ( ( unsigned long long ) region.min ) );
181  }
182  if ( include_length ) {
183  result += memmap_size ( &region );
184  DBGC ( settings, "MEMMAP %d length %#08llx\n", index,
185  ( ( unsigned long long )
186  memmap_size ( &region ) ) );
187  }
188 
189  /* Stop when we have accumulated sufficient regions */
190  if ( --count == 0 )
191  break;
192  }
193 
194  /* Check for nonexistent regions */
195  if ( count && ( ! ignore_nonexistent ) ) {
196  DBGC ( settings, "MEMMAP regions %d-%d do not exist\n",
197  index, ( index + count - 1 ) );
198  return -ENOENT;
199  }
200 
201  /* Scale result */
202  result >>= scale;
203 
204  /* Return result */
205  result = cpu_to_be64 ( result );
206  if ( len > sizeof ( result ) )
207  len = sizeof ( result );
208  memcpy ( data, &result, len );
209 
210  /* Set type if not already specified */
211  if ( ! setting->type )
212  setting->type = &setting_type_hexraw;
213 
214  return sizeof ( result );
215 }
#define MEMMAP_COUNT(tag)
Extract number of regions from setting tag.
#define DBGC(...)
Definition: compiler.h:505
#define MEMMAP_INCLUDE_LENGTH(tag)
Extract length inclusion flag from setting tag.
long index
Definition: bigint.h:62
#define ENOENT
No such file or directory.
Definition: errno.h:514
unsigned long long uint64_t
Definition: stdint.h:13
#define MEMMAP_SCALE(tag)
Extract scale factor from setting tag.
uint32_t start
Starting offset.
Definition: netvsc.h:12
uint64_t tag
Setting tag, if applicable.
Definition: settings.h:43
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define for_each_memmap(region, hide)
Iterate over memory regions.
Definition: memmap.h:183
ring len
Length.
Definition: dwmac.h:231
static unsigned int count
Number of entries.
Definition: dwmac.h:225
const struct setting_type * type
Setting type.
Definition: settings.h:36
#define MEMMAP_START(tag)
Extract starting region from setting tag.
A settings block.
Definition: settings.h:132
A setting.
Definition: settings.h:23
uint16_t result
Definition: hyperv.h:33
static uint64_t memmap_size(const struct memmap_region *region)
Get remaining size of memory region (from the described address upwards)
Definition: memmap.h:98
#define MEMMAP_FL_MEMORY
Contains memory.
Definition: memmap.h:59
uint8_t data[48]
Additional event data.
Definition: ena.h:22
#define cpu_to_be64(value)
Definition: byteswap.h:111
A memory region descriptor.
Definition: memmap.h:48
#define MEMMAP_IGNORE_NONEXISTENT(tag)
Extract ignore flag from setting tag.
#define MEMMAP_INCLUDE_START(tag)
Extract start address inclusion flag from setting tag.

References count, cpu_to_be64, data, DBGC, ENOENT, memmap_region::flags, for_each_memmap, index, len, memcpy(), MEMMAP_COUNT, MEMMAP_FL_MEMORY, MEMMAP_IGNORE_NONEXISTENT, MEMMAP_INCLUDE_LENGTH, MEMMAP_INCLUDE_START, MEMMAP_SCALE, memmap_size(), MEMMAP_START, memmap_region::min, result, start, setting::tag, and setting::type.

◆ memmap_settings_init()

static void memmap_settings_init ( void  )
static

Initialise memory map settings.

Definition at line 233 of file memmap_settings.c.

233  {
234  int rc;
235 
237  "memmap" ) ) != 0 ) {
238  DBG ( "MEMMAP could not register settings: %s\n",
239  strerror ( rc ) );
240  return;
241  }
242 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static struct settings memmap_settings
Memory map settings.
int register_settings(struct settings *settings, struct settings *parent, const char *name)
Register settings block.
Definition: settings.c:475
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References DBG, memmap_settings, NULL, rc, register_settings(), and strerror().

◆ __init_fn()

struct init_fn memmap_settings_init_fn __init_fn ( INIT_NORMAL  )

Memory map settings initialiser.

◆ __setting()

const struct setting memsize_setting __setting ( SETTING_MISC  ,
memsize   
)

Memory map predefined settings.

Variable Documentation

◆ memmap_settings_scope

const struct settings_scope memmap_settings_scope
static

Memory map settings scope.

Definition at line 115 of file memmap_settings.c.

Referenced by memmap_settings_applies().

◆ memmap_settings_operations

struct settings_operations memmap_settings_operations
static
Initial value:
= {
}
static int memmap_settings_applies(struct settings *settings __unused, const struct setting *setting)
Check applicability of memory map setting.
static int memmap_settings_fetch(struct settings *settings, struct setting *setting, void *data, size_t len)
Fetch value of memory map setting.

Memory map settings operations.

Definition at line 218 of file memmap_settings.c.

◆ memmap_settings

struct settings memmap_settings
static
Initial value:
= {
.refcnt = NULL,
.default_scope = &memmap_settings_scope,
}
static struct settings_operations memmap_settings_operations
Memory map settings operations.
static const struct settings_scope memmap_settings_scope
Memory map settings scope.
struct list_head siblings
Sibling settings blocks.
Definition: settings.h:140
static struct settings memmap_settings
Memory map settings.
struct list_head children
Child settings blocks.
Definition: settings.h:142
#define LIST_HEAD_INIT(list)
Initialise a static list head.
Definition: list.h:30
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

Memory map settings.

Definition at line 224 of file memmap_settings.c.

Referenced by memmap_settings_init().