27 lines
942 B
Markdown
27 lines
942 B
Markdown
|
# Extend
|
||
|
|
||
|
The extend mechanism allows a structure to be extended by a model. It works by
|
||
|
placing an array of pointers indexed by the model identifier (char) inside the
|
||
|
structure. Most of the structures of the emulator have a `ext` member, allowing
|
||
|
them to be extended.
|
||
|
|
||
|
Models are forbidden to access information from other models than their own.
|
||
|
|
||
|
The function `void extend_set(struct extend *ext, int id, void *ctx)` stores the
|
||
|
ctx pointer inside the extend structure for the model with the given id.
|
||
|
|
||
|
Use `void *extend_get(struct extend *ext, int id)` to retrieve its value.
|
||
|
|
||
|
A helper macro `EXT(st, m)` directly attempts to find the member `ext` in the
|
||
|
structure st, and return the pointer of the model `m`.
|
||
|
|
||
|
Here is an example where Nanos6 stores its own CPU information:
|
||
|
|
||
|
struct cpu *syscpu;
|
||
|
struct nanos6_cpu *cpu;
|
||
|
|
||
|
extend_set(&syscpu->ext, '6', cpu);
|
||
|
|
||
|
cpu = extend_get(&syscpu->ext, '6');
|
||
|
cpu = EXT(syscpu, '6'); /* same */
|