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