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 */
 |