<< Back to Codezero API Reference

5.) L4_EXCHANGE_REGISTERS System Call

int l4_exchange_registers(void *exregs_struct, l4id_t tid); 
Purpose
Operational Model
/* Values for the flags fields */
#define EXREGS_SET_PAGER		1
#define EXREGS_SET_UTCB		2
 
/* Generic structure passed by userspace pagers for exchanging registers */
struct exregs_data {
	exregs_context_t context;
	u32 valid_vect;
	u32 flags;
	l4id_t pagerid;
	unsigned long utcb_address;
};
 
/* Exchange registers context structure for ARM */
typedef struct arm_exregs_context {
	u32 r0;		/* 0x4 */
	u32 r1;		/* 0x8 */
	u32 r2;		/* 0xC */
	u32 r3;		/* 0x10 */
	u32 r4;		/* 0x14 */
	u32 r5;		/* 0x18 */
	u32 r6; 	/* 0x1C */
	u32 r7;		/* 0x20 */
	u32 r8;		/* 0x24 */
	u32 r9;		/* 0x28 */
	u32 r10;	/* 0x2C */
	u32 r11;	/* 0x30 */
	u32 r12;	/* 0x34 */
	u32 sp;		/* 0x38 */
	u32 lr;		/* 0x3C */
	u32 pc;		/* 0x40 */
} __attribute__((__packed__)) exregs_context_t;
L4 Userspace Library Functions
/* 
 * Exchange register library calls to modify program counter,
 * stack, pager id, utcb address and any hardware register.
 */
void exregs_set_stack(struct exregs_data *s, unsigned long sp);
void exregs_set_mr(struct exregs_data *s, int offset, unsigned long val);
void exregs_set_pc(struct exregs_data *s, unsigned long pc);
void exregs_set_pager(struct exregs_data *s, l4id_t pagerid);
void exregs_set_utcb(struct exregs_data *s, unsigned long virt);

<< Back to Codezero API Reference