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

Last change on this file since 408 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
RevLine 
[258]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.
[399]8// They define more or less the GIET-VM Hardware Abstraction Layer,
[258]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
[324]19//////////////////////////////////////////////////////////////////////////////////
20// NULL pointer definition
21//////////////////////////////////////////////////////////////////////////////////
22
23#define NULL (void *)0
24
[258]25///////////////////////////////////////////////////////////////////////////////////
[351]26// This structure is used to have one single lock in a cache line
[258]27///////////////////////////////////////////////////////////////////////////////////
28
[351]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
[258]36typedef struct _ld_symbol_s _ld_symbol_t;
37
[324]38extern _ld_symbol_t boot_code_vbase;
39extern _ld_symbol_t boot_data_vbase;
[258]40
[324]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;
[258]45
46///////////////////////////////////////////////////////////////////////////////////
[408]47///////////////////////////////////////////////////////////////////////////////////
[399]48//     CP0 registers access functions
[258]49///////////////////////////////////////////////////////////////////////////////////
[408]50///////////////////////////////////////////////////////////////////////////////////
[258]51
[408]52///////////////////////////////////////////////////////////////////////////////////
53// Returns CP0_SCHED register content
54// (virtual base address of the processor scheduler)
55///////////////////////////////////////////////////////////////////////////////////
[258]56extern unsigned int _get_sched(void);
[408]57
58///////////////////////////////////////////////////////////////////////////////////
59// Returns CP0_EPC register content.
60///////////////////////////////////////////////////////////////////////////////////
[258]61extern unsigned int _get_epc(void);
[408]62
63///////////////////////////////////////////////////////////////////////////////////
64// Returns CP0_BVAR register content.
65///////////////////////////////////////////////////////////////////////////////////
[258]66extern unsigned int _get_bvar(void);
[408]67
68///////////////////////////////////////////////////////////////////////////////////
69// Returns CP0_CR register content.
70///////////////////////////////////////////////////////////////////////////////////
[258]71extern unsigned int _get_cr(void);
[408]72
73///////////////////////////////////////////////////////////////////////////////////
74// Returns CP0_SR register content.
75///////////////////////////////////////////////////////////////////////////////////
[258]76extern unsigned int _get_sr(void);
[408]77
78///////////////////////////////////////////////////////////////////////////////////
79// Returns CP0_PROCID register content.
80// Processor identifier (12 bits)
81///////////////////////////////////////////////////////////////////////////////////
[258]82extern unsigned int _get_procid(void);
[408]83
84///////////////////////////////////////////////////////////////////////////////////
85// Returns CP0_TIME register content.
86// Processor local time (32 bits)
87///////////////////////////////////////////////////////////////////////////////////
[258]88extern unsigned int _get_proctime(void);
89
[408]90///////////////////////////////////////////////////////////////////////////////////
91// Save CP0_SR value to variable pointed by save_sr_ptr and disable IRQs.
92///////////////////////////////////////////////////////////////////////////////////
[295]93extern void         _it_disable( unsigned int* save_sr_ptr );
[408]94
95///////////////////////////////////////////////////////////////////////////////////
96// Restore CP0_SR register from variable pointed by save_sr_ptr.
97///////////////////////////////////////////////////////////////////////////////////
[295]98extern void         _it_restore( unsigned int* save_sr_ptr );
[258]99
[408]100///////////////////////////////////////////////////////////////////////////////////
101// Set a new value in CP0_SCHED register.
102// (virtual base address of the processor scheduler)
103///////////////////////////////////////////////////////////////////////////////////
[258]104extern void         _set_sched(unsigned int value);
[408]105
106///////////////////////////////////////////////////////////////////////////////////
107// Set a new value in CP0_SR register.
108///////////////////////////////////////////////////////////////////////////////////
[268]109extern void         _set_sr(unsigned int value);
[258]110
[408]111
[258]112///////////////////////////////////////////////////////////////////////////////////
[408]113///////////////////////////////////////////////////////////////////////////////////
[399]114//     CP2 registers access functions
115///////////////////////////////////////////////////////////////////////////////////
[408]116///////////////////////////////////////////////////////////////////////////////////
[399]117
[408]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///////////////////////////////////////////////////////////////////////////////////
[399]123extern unsigned int _get_mmu_ptpr(void);
[408]124
125///////////////////////////////////////////////////////////////////////////////////
126// Returns CP2_MODE register value.
127// MMU current mode, defined by 4 bits, right justified: ITLB/DTLB/ICACHE/DCACHE
128///////////////////////////////////////////////////////////////////////////////////
[399]129extern unsigned int _get_mmu_mode(void);
130
[408]131///////////////////////////////////////////////////////////////////////////////////
132// Set a new value in CP2_PTPR register.
133///////////////////////////////////////////////////////////////////////////////////
[399]134extern void         _set_mmu_ptpr(unsigned int value);
[408]135
136///////////////////////////////////////////////////////////////////////////////////
137// Set a new value in CP2_MODE register.
138///////////////////////////////////////////////////////////////////////////////////
[399]139extern void         _set_mmu_mode(unsigned int value);
140
141///////////////////////////////////////////////////////////////////////////////////
[408]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///////////////////////////////////////////////////////////////////////////////////
[258]152//     Physical addressing related functions
153///////////////////////////////////////////////////////////////////////////////////
[408]154///////////////////////////////////////////////////////////////////////////////////
[258]155
156extern unsigned int _physical_read(  unsigned long long paddr );
157extern void         _physical_write( unsigned long long paddr,
158                                     unsigned int       value );
159
[370]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
[344]164extern void         _physical_memcpy( unsigned long long dst_paddr,
165                                      unsigned long long src_paddr,
166                                      unsigned int       size );
167
[295]168extern unsigned int _io_extended_read(  unsigned int* vaddr );
169extern void         _io_extended_write( unsigned int* vaddr,
170                                        unsigned int  value );
171
[258]172///////////////////////////////////////////////////////////////////////////////////
173//     Locks access functions
174///////////////////////////////////////////////////////////////////////////////////
175
[351]176extern void         _get_lock(giet_lock_t* lock);
177extern void         _release_lock(giet_lock_t* lock);
[258]178
179///////////////////////////////////////////////////////////////////////////////////
[295]180//     TTY0 access functions
[258]181///////////////////////////////////////////////////////////////////////////////////
182
[295]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
[258]192///////////////////////////////////////////////////////////////////////////////////
[399]193//     Scheduler and task context access functions
[258]194///////////////////////////////////////////////////////////////////////////////////
195
[399]196extern unsigned int _get_current_task_id(void);
[258]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
[399]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
[408]243extern void         _dcache_buf_invalidate( unsigned int buf_vbase, 
244                                            unsigned int buf_size );
[399]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
[258]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.