mirror of
https://github.com/drasko/codezero.git
synced 2026-05-05 01:51:30 +02:00
Added a flag to read registers back for sys_exregs call
This commit is contained in:
@@ -13,6 +13,8 @@
|
|||||||
|
|
||||||
#define EXREGS_SET_PAGER 1
|
#define EXREGS_SET_PAGER 1
|
||||||
#define EXREGS_SET_UTCB 2
|
#define EXREGS_SET_UTCB 2
|
||||||
|
#define EXREGS_READ 4
|
||||||
|
|
||||||
#define EXREGS_VALID_REGULAR_REGS \
|
#define EXREGS_VALID_REGULAR_REGS \
|
||||||
(FIELD_TO_BIT(exregs_context_t, r0) | \
|
(FIELD_TO_BIT(exregs_context_t, r0) | \
|
||||||
FIELD_TO_BIT(exregs_context_t, r1) | \
|
FIELD_TO_BIT(exregs_context_t, r1) | \
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
#include <l4/api/exregs.h>
|
#include <l4/api/exregs.h>
|
||||||
|
|
||||||
/* Copy each register to task's context if its valid bit is set */
|
/* Copy each register to task's context if its valid bit is set */
|
||||||
void do_exchange_registers(struct ktcb *task, struct exregs_data *exregs)
|
void exregs_write_registers(struct ktcb *task, struct exregs_data *exregs)
|
||||||
{
|
{
|
||||||
task_context_t *context = &task->context;
|
task_context_t *context = &task->context;
|
||||||
|
|
||||||
@@ -78,6 +78,57 @@ flags:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void exregs_read_registers(struct ktcb *task, struct exregs_data *exregs)
|
||||||
|
{
|
||||||
|
task_context_t *context = &task->context;
|
||||||
|
|
||||||
|
if (!exregs->valid_vect)
|
||||||
|
goto flags;
|
||||||
|
|
||||||
|
/* Check register valid bit and copy registers */
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, r0))
|
||||||
|
exregs->context.r0 = context->r0;
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, r1))
|
||||||
|
exregs->context.r1 = context->r1;
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, r2))
|
||||||
|
exregs->context.r2 = context->r2;
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, r3))
|
||||||
|
exregs->context.r3 = context->r3;
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, r4))
|
||||||
|
exregs->context.r4 = context->r4;
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, r5))
|
||||||
|
exregs->context.r5 = context->r5;
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, r6))
|
||||||
|
exregs->context.r6 = context->r6;
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, r7))
|
||||||
|
exregs->context.r7 = context->r7;
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, r8))
|
||||||
|
exregs->context.r8 = context->r8;
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, r9))
|
||||||
|
exregs->context.r9 = context->r9;
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, r10))
|
||||||
|
exregs->context.r10 = context->r10;
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, r11))
|
||||||
|
exregs->context.r11 = context->r11;
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, r12))
|
||||||
|
exregs->context.r12 = context->r12;
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, sp))
|
||||||
|
exregs->context.sp = context->sp;
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, lr))
|
||||||
|
exregs->context.lr = context->lr;
|
||||||
|
if (exregs->valid_vect & FIELD_TO_BIT(exregs_context_t, pc))
|
||||||
|
exregs->context.pc = context->pc;
|
||||||
|
|
||||||
|
flags:
|
||||||
|
/* Read thread's pager if pager flag supplied */
|
||||||
|
if (exregs->flags & EXREGS_SET_PAGER)
|
||||||
|
exregs->pagerid = task->pagerid;
|
||||||
|
|
||||||
|
/* Read thread's utcb if utcb flag supplied */
|
||||||
|
if (exregs->flags & EXREGS_SET_UTCB)
|
||||||
|
exregs->utcb_address = task->utcb_address;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* exchange_registers()
|
* exchange_registers()
|
||||||
*
|
*
|
||||||
@@ -141,7 +192,10 @@ int sys_exchange_registers(struct exregs_data *exregs, l4id_t tid)
|
|||||||
return -ENOCAP;
|
return -ENOCAP;
|
||||||
|
|
||||||
/* Copy registers */
|
/* Copy registers */
|
||||||
do_exchange_registers(task, exregs);
|
if (exregs->flags & EXREGS_READ)
|
||||||
|
exregs_read_registers(task, exregs);
|
||||||
|
else
|
||||||
|
exregs_write_registers(task, exregs);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
/* Unlock and return */
|
/* Unlock and return */
|
||||||
|
|||||||
Reference in New Issue
Block a user