source: soft/giet_vm/sys/common.c @ 164

Last change on this file since 164 was 160, checked in by karaoui, 12 years ago

giet-vm new version

File size: 8.3 KB
Line 
1///////////////////////////////////////////////////////////////////////////////////
2// File     : common.c
3// Date     : 01/04/2012
4// Author   : alain greiner and joel porquet
5// Copyright (c) UPMC-LIP6
6///////////////////////////////////////////////////////////////////////////////////
7// The common.c and common.h files are part of the GIET nano-kernel.
8// They contains various utilities functions.
9///////////////////////////////////////////////////////////////////////////////////
10
11#include <common.h>
12#include <drivers.h>
13#include <stdarg.h>
14
15////////////////////////////////////////////////////////////////////////////
16// _puts()
17// used for system code debug / it uses TTY0
18////////////////////////////////////////////////////////////////////////////
19void _puts(char *buffer) 
20{
21    unsigned int* tty_address = (unsigned int*)&seg_tty_base;
22    unsigned int n;
23
24    for ( n=0; n<100; n++)
25    {
26        if (buffer[n] == 0) break;
27        tty_address[0] = (unsigned int)buffer[n];
28    }
29}
30////////////////////////////////////////////////////////////////////////////
31// _putw()
32// used for system code debug / it uses TTY0
33////////////////////////////////////////////////////////////////////////////
34void _putw(unsigned int val)
35{
36    static const char   HexaTab[] = "0123456789ABCDEF";
37    char                buf[11];
38    unsigned int        c;
39
40    buf[0]  = '0';
41    buf[1]  = 'x';
42    buf[10] = 0;
43
44    for ( c = 0 ; c < 8 ; c++ )
45    { 
46        buf[9-c] = HexaTab[val&0xF];
47        val = val >> 4;
48    }
49    _puts(buf);
50}
51////////////////////////////////////////////////////////////////////////////
52// _strncmp()
53// compare two strings s1 & s2 (no more than n characters)
54////////////////////////////////////////////////////////////////////////////
55unsigned int _strncmp(const char* s1, 
56                      const char* s2, 
57                      unsigned int n)
58{
59    unsigned int i;
60    for ( i=0 ; i<n ; i++)
61    {
62        if ( s1[i] != s2[i] ) return 1;
63        if ( s1[i] == 0 )     break;
64    }
65    return 0;
66}
67////////////////////////////////////////////////////////////////////////////
68//      _dcache_buf_invalidate()
69// Invalidate all data cache lines corresponding to a memory
70// buffer (identified by an address and a size).
71////////////////////////////////////////////////////////////////////////////
72void _dcache_buf_invalidate(const void *buffer, 
73                            unsigned int size)
74{
75    unsigned int i;
76    unsigned int tmp;
77    unsigned int line_size;
78
79    /*
80     * compute data cache line size based on config register (bits 12:10)
81     */
82    asm volatile("mfc0 %0, $16, 1" : "=r"(tmp));
83    tmp = ((tmp>>10) & 0x7);
84    line_size = 2 << tmp;
85
86    /* iterate on cache lines to invalidate each one of them */
87    for (i = 0; i < size; i += line_size)
88    {
89        asm volatile(
90                " cache %0, %1"
91                ::"i" (0x11), "R" (*((unsigned char*)buffer+i))
92                );
93    }
94}
95///////////////////////////////////////////////////////////////////////////////////
96//      _itoa_dec()
97// Convert a 32-bit unsigned integer to a string of ten decimal characters.
98///////////////////////////////////////////////////////////////////////////////////
99void _itoa_dec(unsigned int val, char *buf)
100{
101    const static char dectab[] = "0123456789";
102    unsigned int i;
103
104    for (i = 0; i < 10; i++)
105    {
106        if ((val != 0) || (i == 0))
107            buf[9-i] = dectab[val % 10];
108        else
109            buf[9-i] = 0x20;
110        val /= 10;
111    }
112}
113///////////////////////////////////////////////////////////////////////////////////
114//      _itoa_hex()
115// Convert a 32-bit unsigned integer to a string of eight hexadecimal characters.
116///////////////////////////////////////////////////////////////////////////////////
117void _itoa_hex(unsigned int val, char *buf)
118{
119    const static char hexatab[] = "0123456789ABCD";
120    unsigned int i;
121
122    for (i = 0; i < 8; i++)
123    {
124        buf[7-i] = hexatab[val % 16];
125        val /= 16;
126    }
127}
128///////////////////////////////////////////////////////////////////////////////////
129//      _get_epc()
130// Access CP0 and returns EPC register.
131///////////////////////////////////////////////////////////////////////////////////
132inline unsigned int _get_epc()
133{
134    unsigned int ret;
135    asm volatile("mfc0 %0, $14" : "=r"(ret));
136    return ret;
137}
138///////////////////////////////////////////////////////////////////////////////////
139//      _get_bar()
140// Access CP0 and returns BAR register.
141///////////////////////////////////////////////////////////////////////////////////
142inline unsigned int _get_bar()
143{
144    unsigned int ret;
145    asm volatile("mfc0 %0, $8" : "=r"(ret));
146    return ret;
147}
148///////////////////////////////////////////////////////////////////////////////////
149//      _get_cr()
150// Access CP0 and returns CR register.
151///////////////////////////////////////////////////////////////////////////////////
152inline unsigned int _get_cause()
153{
154    unsigned int ret;
155    asm volatile("mfc0 %0, $13" : "=r"(ret));
156    return ret;
157}
158///////////////////////////////////////////////////////////////////////////////////
159//      _it_mask()
160// Access CP0 and mask IRQs
161///////////////////////////////////////////////////////////////////////////////////
162inline void _it_mask()
163{
164    asm volatile(
165            "mfc0  $2, $12     \n"
166            "ori   $2, $2, 1   \n"
167            "mtc0  $2, $12     \n"
168            ::: "$2"
169            );
170}
171///////////////////////////////////////////////////////////////////////////////////
172//      _it_enable()
173// Access CP0 and enable IRQs
174///////////////////////////////////////////////////////////////////////////////////
175inline void _it_enable()
176{
177    asm volatile(
178            "mfc0  $2, $12     \n"
179            "addi  $2, $2, -1  \n"
180            "mtc0  $2, $12     \n"
181            ::: "$2"
182            );
183}
184/////////////////////////////////////////////////////////////////////////////
185//      access functions to mapping_info data structure
186/////////////////////////////////////////////////////////////////////////////
187mapping_cluster_t* _get_cluster_base( mapping_header_t* header )
188{
189    return   (mapping_cluster_t*) ((char*)header +
190                                  MAPPING_HEADER_SIZE);
191}
192/////////////////////////////////////////////////////////////////////////////
193mapping_pseg_t* _get_pseg_base( mapping_header_t* header )
194{
195    return   (mapping_pseg_t*)    ((char*)header +
196                                  MAPPING_HEADER_SIZE +
197                                  MAPPING_CLUSTER_SIZE*header->clusters);
198}
199/////////////////////////////////////////////////////////////////////////////
200mapping_vspace_t* _get_vspace_base( mapping_header_t* header )
201{
202    return   (mapping_vspace_t*)  ((char*)header +
203                                  MAPPING_HEADER_SIZE +
204                                  MAPPING_CLUSTER_SIZE*header->clusters +
205                                  MAPPING_PSEG_SIZE*header->psegs);
206}
207/////////////////////////////////////////////////////////////////////////////
208mapping_vseg_t* _get_vseg_base( mapping_header_t* header )
209{
210    return   (mapping_vseg_t*)    ((char*)header +
211                                  MAPPING_HEADER_SIZE +
212                                  MAPPING_CLUSTER_SIZE*header->clusters +
213                                  MAPPING_PSEG_SIZE*header->psegs +
214                                  MAPPING_VSPACE_SIZE*header->vspaces);
215}
216/////////////////////////////////////////////////////////////////////////////
217mapping_vobj_t* _get_vobj_base( mapping_header_t* header )
218{
219    return   (mapping_vobj_t*)   ((char*)header +
220                                  MAPPING_HEADER_SIZE +
221                                  MAPPING_CLUSTER_SIZE*header->clusters +
222                                  MAPPING_PSEG_SIZE*header->psegs +
223                                  MAPPING_VSPACE_SIZE*header->vspaces +
224                                  MAPPING_VSEG_SIZE*header->vsegs );
225}
226/////////////////////////////////////////////////////////////////////////////
227mapping_task_t* _get_task_base( mapping_header_t* header )
228{
229    return   (mapping_task_t*)    ((char*)header +
230                                  MAPPING_HEADER_SIZE +
231                                  MAPPING_CLUSTER_SIZE*header->clusters +
232                                  MAPPING_PSEG_SIZE*header->psegs +
233                                  MAPPING_VSPACE_SIZE*header->vspaces +
234                                  MAPPING_VOBJ_SIZE*header->vobjs +
235                                  MAPPING_VSEG_SIZE*header->vsegs);
236}
237
238
Note: See TracBrowser for help on using the repository browser.