OpenCores
URL https://opencores.org/ocsvn/c0or1k/c0or1k/trunk

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [conts/] [libl4/] [src/] [arch/] [or1k/] [exregs.c] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 drasko
/*
2
 * Generic to arch-specific interface for
3
 * exchange_registers()
4
 *
5
 * Copyright (C) 2008 Bahadir Balban
6
 */
7
#include <l4/macros.h>
8
#include <l4lib/exregs.h>
9
#include L4LIB_INC_ARCH(syslib.h)
10
#include INC_GLUE(message.h)
11
 
12
void exregs_set_read(struct exregs_data *exregs)
13
{
14
        exregs->flags |= EXREGS_READ;
15
}
16
 
17
void exregs_print_registers(void)
18
{
19
        struct exregs_data exregs;
20
 
21
        /* Read registers */
22
        memset(&exregs, 0, sizeof(exregs));
23
        exregs.valid_vect = ~0;  /* Set all flags */
24
        exregs.flags |= EXREGS_READ;
25
        exregs.flags |= EXREGS_SET_UTCB;
26
        exregs.flags |= EXREGS_SET_PAGER;
27
        BUG_ON(l4_exchange_registers(&exregs, self_tid()) < 0);
28
 
29
        /* Print out registers */
30
        printf("Task (%x) register state upon fault:\n", self_tid());
31
        printf("R0: 0x%x\n", exregs.context.r0);
32
        printf("R1: 0x%x\n", exregs.context.r1);
33
        printf("R2: 0x%x\n", exregs.context.r2);
34
        printf("R3: 0x%x\n", exregs.context.r3);
35
        printf("R4: 0x%x\n", exregs.context.r4);
36
        printf("R5: 0x%x\n", exregs.context.r5);
37
        printf("R6: 0x%x\n", exregs.context.r6);
38
        printf("R7: 0x%x\n", exregs.context.r7);
39
        printf("R8: 0x%x\n", exregs.context.r8);
40
        printf("R9: 0x%x\n", exregs.context.r9);
41
        printf("R10: 0x%x\n", exregs.context.r10);
42
        printf("R11: 0x%x\n", exregs.context.r11);
43
        printf("R12: 0x%x\n", exregs.context.r12);
44
        printf("R13: 0x%x\n", exregs.context.sp);
45
        printf("R14: 0x%x\n", exregs.context.lr);
46
        printf("R15: 0x%x\n", exregs.context.pc);
47
        printf("Pager: 0x%x\n", exregs.pagerid);
48
        printf("Utcb @ 0x%lx\n", exregs.utcb_address);
49
}
50
 
51
void exregs_set_mr(struct exregs_data *s, int offset, unsigned long val)
52
{
53
        /* Get MR0 */
54
        u32 *mr = &s->context.MR0_REGISTER;
55
 
56
        /* Sanity check */
57
        BUG_ON(offset > MR_TOTAL || offset < 0);
58
 
59
        /* Set MR */
60
        mr[offset] = val;
61
 
62
        /* Set valid bit for mr register */
63
        s->valid_vect |= FIELD_TO_BIT(exregs_context_t, MR0_REGISTER) << offset;
64
}
65
 
66
void exregs_set_pager(struct exregs_data *s, l4id_t pagerid)
67
{
68
        s->pagerid = pagerid;
69
        s->flags |= EXREGS_SET_PAGER;
70
}
71
 
72
unsigned long exregs_get_utcb(struct exregs_data *s)
73
{
74
        return s->utcb_address;
75
}
76
 
77
unsigned long exregs_get_stack(struct exregs_data *s)
78
{
79
        return s->context.sp;
80
}
81
 
82
void exregs_set_utcb(struct exregs_data *s, unsigned long virt)
83
{
84
        s->utcb_address = virt;
85
        s->flags |= EXREGS_SET_UTCB;
86
}
87
 
88
void exregs_set_stack(struct exregs_data *s, unsigned long sp)
89
{
90
        s->context.sp = sp;
91
        s->valid_vect |= FIELD_TO_BIT(exregs_context_t, sp);
92
}
93
 
94
void exregs_set_pc(struct exregs_data *s, unsigned long pc)
95
{
96
        s->context.pc = pc;
97
        s->valid_vect |= FIELD_TO_BIT(exregs_context_t, pc);
98
}
99
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.