iPXE
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.
#define MEMMAP_COUNT(tag)
 Extract number of regions from setting tag.
#define MEMMAP_START(tag)
 Extract starting region from setting tag.
#define MEMMAP_IGNORE_NONEXISTENT(tag)
 Extract ignore flag from setting tag.
#define MEMMAP_INCLUDE_LENGTH(tag)
 Extract length inclusion flag from setting tag.
#define MEMMAP_INCLUDE_START(tag)
 Extract start address inclusion flag from setting tag.
#define MEMMAP_SCALE(tag)
 Extract scale factor from setting tag.

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.
static int memmap_settings_fetch (struct settings *settings, struct setting *setting, void *data, size_t len)
 Fetch value of memory map setting.
static void memmap_settings_init (void)
 Initialise memory map settings.
struct init_fn memmap_settings_init_fn __init_fn (INIT_NORMAL)
 Memory map settings initialiser.
const struct setting memsize_setting __setting (SETTING_MISC, memsize)
 Memory map predefined settings.

Variables

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

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:1
static unsigned int count
Number of entries.
Definition dwmac.h:220

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.

Referenced by __setting().

◆ MEMMAP_COUNT

#define MEMMAP_COUNT ( tag)
Value:
( ( ( (tag) >> 24 ) & 0xff ) + 1 )
uint64_t tag
Identity tag.
Definition edd.h: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.

Referenced by memmap_settings_fetch().

◆ MEMMAP_START

#define MEMMAP_START ( tag)
Value:
( ( (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.

Referenced by memmap_settings_fetch().

◆ MEMMAP_IGNORE_NONEXISTENT

#define MEMMAP_IGNORE_NONEXISTENT ( tag)
Value:
( (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.

Referenced by memmap_settings_fetch().

◆ MEMMAP_INCLUDE_LENGTH

#define MEMMAP_INCLUDE_LENGTH ( tag)
Value:
( (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.

Referenced by memmap_settings_fetch().

◆ MEMMAP_INCLUDE_START

#define MEMMAP_INCLUDE_START ( tag)
Value:
( (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.

Referenced by memmap_settings_fetch().

◆ MEMMAP_SCALE

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

Extract scale factor from setting tag.

Parameters
tagSetting tag
scaleScale factor

Definition at line 112 of file memmap_settings.c.

Referenced by memmap_settings_fetch().

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ memmap_settings_applies()

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:24
const struct settings_scope * scope
Setting scope (or NULL)
Definition settings.h:50

References __unused, memmap_settings_scope, and setting::scope.

◆ memmap_settings_fetch()

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 */
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 */
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}
uint16_t result
Definition hyperv.h:33
unsigned long long uint64_t
Definition stdint.h:13
long index
Definition bigint.h:65
ring len
Length.
Definition dwmac.h:226
uint8_t data[48]
Additional event data.
Definition ena.h:11
#define DBGC(...)
Definition compiler.h:505
#define ENOENT
No such file or directory.
Definition errno.h:515
#define cpu_to_be64(value)
Definition byteswap.h:112
#define MEMMAP_FL_MEMORY
Contains memory.
Definition memmap.h:60
static uint64_t memmap_size(const struct memmap_region *region)
Get remaining size of memory region (from the described address upwards)
Definition memmap.h:99
#define for_each_memmap(region, hide)
Iterate over memory regions.
Definition memmap.h:184
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define MEMMAP_START(tag)
Extract starting region from setting tag.
#define MEMMAP_COUNT(tag)
Extract number of regions from setting tag.
#define MEMMAP_INCLUDE_START(tag)
Extract start address inclusion flag from setting tag.
#define MEMMAP_IGNORE_NONEXISTENT(tag)
Extract ignore flag from setting tag.
#define MEMMAP_INCLUDE_LENGTH(tag)
Extract length inclusion flag from setting tag.
#define MEMMAP_SCALE(tag)
Extract scale factor from setting tag.
A memory region descriptor.
Definition memmap.h:49
const struct setting_type * type
Setting type.
Definition settings.h:37
uint64_t tag
Setting tag, if applicable.
Definition settings.h:44
A settings block.
Definition settings.h:133

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()

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}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
#define DBG(...)
Print a debugging message.
Definition compiler.h:498
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:476
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79

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

Referenced by __init_fn().

◆ __init_fn()

struct init_fn memmap_settings_init_fn __init_fn ( INIT_NORMAL )

Memory map settings initialiser.

References __init_fn, INIT_NORMAL, and memmap_settings_init().

◆ __setting()

const struct setting memsize_setting __setting ( SETTING_MISC ,
memsize  )

Memory map predefined settings.

References __setting, memmap_settings_scope, MEMMAP_TAG, and SETTING_MISC.

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 __setting(), and memmap_settings_applies().

◆ memmap_settings_operations

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

Memory map settings operations.

Definition at line 218 of file memmap_settings.c.

218 {
219 .applies = memmap_settings_applies,
220 .fetch = memmap_settings_fetch,
221};

◆ memmap_settings

struct settings memmap_settings
static
Initial value:
= {
.refcnt = NULL,
.siblings = LIST_HEAD_INIT ( memmap_settings.siblings ),
.children = LIST_HEAD_INIT ( memmap_settings.children ),
.default_scope = &memmap_settings_scope,
}
#define LIST_HEAD_INIT(list)
Initialise a static list head.
Definition list.h:31
static struct settings_operations memmap_settings_operations
Memory map settings operations.

Memory map settings.

Definition at line 224 of file memmap_settings.c.

224 {
225 .refcnt = NULL,
226 .siblings = LIST_HEAD_INIT ( memmap_settings.siblings ),
227 .children = LIST_HEAD_INIT ( memmap_settings.children ),
229 .default_scope = &memmap_settings_scope,
230};

Referenced by memmap_settings_init(), and REQUIRE_OBJECT().