source: soft/giet_vm/giet_common/utils.h @ 411

Last change on this file since 411 was 408, checked in by alain, 10 years ago

Introducing a physical memory allocator (pmem.c & pmem.h files).

  • Property svn:executable set to *
File size: 12.2 KB
Line 
1///////////////////////////////////////////////////////////////////////////////////
2// File     : utils.h
3// Date     : 18/10/2013
4// Author   : alain greiner
5// Copyright (c) UPMC-LIP6
6///////////////////////////////////////////////////////////////////////////////////
7// The utils.c and utils.h files are part of the GIET-VM nano-kernel.
8// They define more or less the GIET-VM Hardware Abstraction Layer,
9// and contains various utility functions, that can be used by both the
10// boot code and the kernel code.
11///////////////////////////////////////////////////////////////////////////////////
12
13#ifndef GIET_UTILS_H
14#define GIET_UTILS_H
15
16#include <mapping_info.h>
17#include <giet_config.h>
18
19//////////////////////////////////////////////////////////////////////////////////
20// NULL pointer definition
21//////////////////////////////////////////////////////////////////////////////////
22
23#define NULL (void *)0
24
25///////////////////////////////////////////////////////////////////////////////////
26// This structure is used to have one single lock in a cache line
27///////////////////////////////////////////////////////////////////////////////////
28
29typedef struct giet_lock_s { unsigned int value;
30                             unsigned int padding[15]; } giet_lock_t;
31
32///////////////////////////////////////////////////////////////////////////////////
33// To access the virtual addresses defined in the giet_vsegs.ld file.
34///////////////////////////////////////////////////////////////////////////////////
35
36typedef struct _ld_symbol_s _ld_symbol_t;
37
38extern _ld_symbol_t boot_code_vbase;
39extern _ld_symbol_t boot_data_vbase;
40
41extern _ld_symbol_t kernel_code_vbase;
42extern _ld_symbol_t kernel_data_vbase;
43extern _ld_symbol_t kernel_uncdata_vbase;
44extern _ld_symbol_t kernel_init_vbase;
45
46///////////////////////////////////////////////////////////////////////////////////
47///////////////////////////////////////////////////////////////////////////////////
48//     CP0 registers access functions
49///////////////////////////////////////////////////////////////////////////////////
50///////////////////////////////////////////////////////////////////////////////////
51
52///////////////////////////////////////////////////////////////////////////////////
53// Returns CP0_SCHED register content
54// (virtual base address of the processor scheduler)
55///////////////////////////////////////////////////////////////////////////////////
56extern unsigned int _get_sched(void);
57
58///////////////////////////////////////////////////////////////////////////////////
59// Returns CP0_EPC register content.
60///////////////////////////////////////////////////////////////////////////////////
61extern unsigned int _get_epc(void);
62
63///////////////////////////////////////////////////////////////////////////////////
64// Returns CP0_BVAR register content.
65///////////////////////////////////////////////////////////////////////////////////
66extern unsigned int _get_bvar(void);
67
68///////////////////////////////////////////////////////////////////////////////////
69// Returns CP0_CR register content.
70///////////////////////////////////////////////////////////////////////////////////
71extern unsigned int _get_cr(void);
72
73///////////////////////////////////////////////////////////////////////////////////
74// Returns CP0_SR register content.
75///////////////////////////////////////////////////////////////////////////////////
76extern unsigned int _get_sr(void);
77
78///////////////////////////////////////////////////////////////////////////////////
79// Returns CP0_PROCID register content.
80// Processor identifier (12 bits)
81///////////////////////////////////////////////////////////////////////////////////
82extern unsigned int _get_procid(void);
83
84///////////////////////////////////////////////////////////////////////////////////
85// Returns CP0_TIME register content.
86// Processor local time (32 bits)
87///////////////////////////////////////////////////////////////////////////////////
88extern unsigned int _get_proctime(void);
89
90///////////////////////////////////////////////////////////////////////////////////
91// Save CP0_SR value to variable pointed by save_sr_ptr and disable IRQs.
92///////////////////////////////////////////////////////////////////////////////////
93extern void         _it_disable( unsigned int* save_sr_ptr );
94
95///////////////////////////////////////////////////////////////////////////////////
96// Restore CP0_SR register from variable pointed by save_sr_ptr.
97///////////////////////////////////////////////////////////////////////////////////
98extern void         _it_restore( unsigned int* save_sr_ptr );
99
100///////////////////////////////////////////////////////////////////////////////////
101// Set a new value in CP0_SCHED register.
102// (virtual base address of the processor scheduler)
103///////////////////////////////////////////////////////////////////////////////////
104extern void         _set_sched(unsigned int value);
105
106///////////////////////////////////////////////////////////////////////////////////
107// Set a new value in CP0_SR register.
108///////////////////////////////////////////////////////////////////////////////////
109extern void         _set_sr(unsigned int value);
110
111
112///////////////////////////////////////////////////////////////////////////////////
113///////////////////////////////////////////////////////////////////////////////////
114//     CP2 registers access functions
115///////////////////////////////////////////////////////////////////////////////////
116///////////////////////////////////////////////////////////////////////////////////
117
118///////////////////////////////////////////////////////////////////////////////////
119// Returns CP2_PTPR register value.
120// Page table physical base address for the running context.
121// Contains only the 27 MSB bits, right justified.
122///////////////////////////////////////////////////////////////////////////////////
123extern unsigned int _get_mmu_ptpr(void);
124
125///////////////////////////////////////////////////////////////////////////////////
126// Returns CP2_MODE register value.
127// MMU current mode, defined by 4 bits, right justified: ITLB/DTLB/ICACHE/DCACHE
128///////////////////////////////////////////////////////////////////////////////////
129extern unsigned int _get_mmu_mode(void);
130
131///////////////////////////////////////////////////////////////////////////////////
132// Set a new value in CP2_PTPR register.
133///////////////////////////////////////////////////////////////////////////////////
134extern void         _set_mmu_ptpr(unsigned int value);
135
136///////////////////////////////////////////////////////////////////////////////////
137// Set a new value in CP2_MODE register.
138///////////////////////////////////////////////////////////////////////////////////
139extern void         _set_mmu_mode(unsigned int value);
140
141///////////////////////////////////////////////////////////////////////////////////
142// Set a value in  CP2_DCACHE_INVAL register.
143// It invalidates the data cache line, if the virtual address defined by the
144// value argument hit in DCACHE.
145///////////////////////////////////////////////////////////////////////////////////
146extern void         _set_mmu_dcache_inval(unsigned int value);
147
148
149
150///////////////////////////////////////////////////////////////////////////////////
151///////////////////////////////////////////////////////////////////////////////////
152//     Physical addressing related functions
153///////////////////////////////////////////////////////////////////////////////////
154///////////////////////////////////////////////////////////////////////////////////
155
156extern unsigned int _physical_read(  unsigned long long paddr );
157extern void         _physical_write( unsigned long long paddr,
158                                     unsigned int       value );
159
160extern unsigned long long _physical_read_ull(  unsigned long long paddr );
161extern void               _physical_write_ull( unsigned long long paddr,
162                                               unsigned long long value );
163
164extern void         _physical_memcpy( unsigned long long dst_paddr,
165                                      unsigned long long src_paddr,
166                                      unsigned int       size );
167
168extern unsigned int _io_extended_read(  unsigned int* vaddr );
169extern void         _io_extended_write( unsigned int* vaddr,
170                                        unsigned int  value );
171
172///////////////////////////////////////////////////////////////////////////////////
173//     Locks access functions
174///////////////////////////////////////////////////////////////////////////////////
175
176extern void         _get_lock(giet_lock_t* lock);
177extern void         _release_lock(giet_lock_t* lock);
178
179///////////////////////////////////////////////////////////////////////////////////
180//     TTY0 access functions
181///////////////////////////////////////////////////////////////////////////////////
182
183extern void         _puts( char*        string );
184extern void         _putx( unsigned int val );
185extern void         _putd( unsigned int val ); 
186extern void         _putl( unsigned long long val );
187
188extern void         _printf(char* format, ...); 
189
190extern void         _getc( char*        byte );       
191
192///////////////////////////////////////////////////////////////////////////////////
193//     Scheduler and task context access functions
194///////////////////////////////////////////////////////////////////////////////////
195
196extern unsigned int _get_current_task_id(void);
197
198extern unsigned int _get_task_slot( unsigned int gpid,
199                                    unsigned int ltid,
200                                    unsigned int slot );
201extern void         _set_task_slot( unsigned int gpid,
202                                    unsigned int ltid,
203                                    unsigned int slot,
204                                    unsigned int value );
205
206extern unsigned int _get_context_slot( unsigned int slot );
207extern void         _set_context_slot( unsigned int slot,
208                                       unsigned int value );
209
210///////////////////////////////////////////////////////////////////////////////////
211//     Mapping access functions
212///////////////////////////////////////////////////////////////////////////////////
213
214extern mapping_cluster_t *  _get_cluster_base(mapping_header_t* header);
215extern mapping_pseg_t *     _get_pseg_base(mapping_header_t* header);
216extern mapping_vspace_t *   _get_vspace_base(mapping_header_t* header);
217extern mapping_vseg_t *     _get_vseg_base(mapping_header_t* header);
218extern mapping_vobj_t *     _get_vobj_base(mapping_header_t* header);
219extern mapping_task_t *     _get_task_base(mapping_header_t* header);
220extern mapping_proc_t *     _get_proc_base(mapping_header_t* header);
221extern mapping_irq_t *      _get_irq_base(mapping_header_t* header);
222extern mapping_coproc_t *   _get_coproc_base(mapping_header_t* header);
223extern mapping_cp_port_t *  _get_cp_port_base(mapping_header_t* header);
224extern mapping_periph_t *   _get_periph_base(mapping_header_t* header);
225
226///////////////////////////////////////////////////////////////////////////////////
227//     Miscelaneous functions
228///////////////////////////////////////////////////////////////////////////////////
229
230extern void         _exit(void);
231
232extern void         _random_wait( unsigned int value );
233
234extern void         _break( char* str);
235
236extern unsigned int _strncmp(const char*  s1, 
237                             const char*  s2, 
238                             unsigned int n);
239
240extern char*        _strcpy( char*        dest,
241                             char*        source );
242
243extern void         _dcache_buf_invalidate( unsigned int buf_vbase, 
244                                            unsigned int buf_size );
245
246extern unsigned int _heap_info( unsigned int* vaddr,
247                                unsigned int* length,
248                                unsigned int  x,
249                                unsigned int  y );
250
251///////////////////////////////////////////////////////////////////////////////////
252//     Required by GCC
253///////////////////////////////////////////////////////////////////////////////////
254
255extern void* memcpy( void* _dst, 
256                     const void* _src, 
257                     unsigned int size );
258
259extern void* memset( void* dst, 
260                     int s, 
261                     unsigned int count );
262
263
264#endif
265
266// Local Variables:
267// tab-width: 4
268// c-basic-offset: 4
269// c-file-offsets:((innamespace . 0)(inline-open . 0))
270// indent-tabs-mode: nil
271// End:
272// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
273
Note: See TracBrowser for help on using the repository browser.