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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [hal/] [mn10300/] [am33/] [current/] [src/] [var_misc.c] - Blame information for rev 856

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 786 skrzyp
//==========================================================================
2
//
3
//      var_misc.c
4
//
5
//      HAL CPU variant miscellaneous functions
6
//
7
//==========================================================================
8
// ####ECOSGPLCOPYRIGHTBEGIN####                                            
9
// -------------------------------------------                              
10
// This file is part of eCos, the Embedded Configurable Operating System.   
11
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
12
//
13
// eCos is free software; you can redistribute it and/or modify it under    
14
// the terms of the GNU General Public License as published by the Free     
15
// Software Foundation; either version 2 or (at your option) any later      
16
// version.                                                                 
17
//
18
// eCos is distributed in the hope that it will be useful, but WITHOUT      
19
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or    
20
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License    
21
// for more details.                                                        
22
//
23
// You should have received a copy of the GNU General Public License        
24
// along with eCos; if not, write to the Free Software Foundation, Inc.,    
25
// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
26
//
27
// As a special exception, if other files instantiate templates or use      
28
// macros or inline functions from this file, or you compile this file      
29
// and link it with other works to produce a work based on this file,       
30
// this file does not by itself cause the resulting work to be covered by   
31
// the GNU General Public License. However the source code for this file    
32
// must still be made available in accordance with section (3) of the GNU   
33
// General Public License v2.                                               
34
//
35
// This exception does not invalidate any other reasons why a work based    
36
// on this file might be covered by the GNU General Public License.         
37
// -------------------------------------------                              
38
// ####ECOSGPLCOPYRIGHTEND####                                              
39
//==========================================================================
40
//#####DESCRIPTIONBEGIN####
41
//
42
// Author(s):    nickg
43
// Contributors: nickg, jlarmour, dmoseley
44
// Date:         1999-01-21
45
// Purpose:      HAL miscellaneous functions
46
// Description:  This file contains miscellaneous functions provided by the
47
//               HAL.
48
//
49
//####DESCRIPTIONEND####
50
//
51
//========================================================================*/
52
 
53
#include <pkgconf/hal.h>
54
 
55
#include <cyg/infra/cyg_type.h>         // Base types
56
#include <cyg/infra/cyg_trac.h>         // tracing macros
57
#include <cyg/infra/cyg_ass.h>          // assertion macros
58
 
59
#include <cyg/hal/hal_cache.h>
60
 
61
#include <cyg/hal/hal_intr.h>           // HAL_CLOCK_READ
62
#include CYGHWR_MEMORY_LAYOUT_H
63
 
64
/*------------------------------------------------------------------------*/
65
/* Variant specific initialization routine.                               */
66
 
67
void hal_variant_init(void)
68
{
69
    // Let the timer run at a default rate (for delays)
70
    HAL_CLOCK_INITIALIZE(CYGNUM_HAL_RTC_PERIOD);
71
}
72
 
73
/*------------------------------------------------------------------------*/
74
/* Cache functions.                                                       */
75
 
76
#if 0 //!defined(CYG_HAL_MN10300_SIM)
77
void cyg_hal_dcache_store(CYG_ADDRWORD base, int size)
78
{
79
    volatile register CYG_BYTE *way0 = HAL_DCACHE_PURGE_WAY0;
80
    volatile register CYG_BYTE *way1 = HAL_DCACHE_PURGE_WAY1;
81
    volatile register CYG_BYTE *way2 = HAL_DCACHE_PURGE_WAY2;
82
    volatile register CYG_BYTE *way3 = HAL_DCACHE_PURGE_WAY3;
83
    register int i;
84
    register CYG_ADDRWORD state;
85
 
86
    HAL_DCACHE_IS_ENABLED(state);
87
    if (state)
88
        HAL_DCACHE_DISABLE();
89
 
90
    way0 += base & 0x000003f0;
91
    way1 += base & 0x000003f0;
92
    way2 += base & 0x000003f0;
93
    way3 += base & 0x000003f0;
94
    for( i = 0; i < size; i += HAL_DCACHE_LINE_SIZE )
95
    {
96
        *(CYG_ADDRWORD *)way0 = 0;
97
        *(CYG_ADDRWORD *)way1 = 0;
98
        *(CYG_ADDRWORD *)way2 = 0;
99
        *(CYG_ADDRWORD *)way3 = 0;
100
        way0 += HAL_DCACHE_LINE_SIZE;
101
        way1 += HAL_DCACHE_LINE_SIZE;
102
        way2 += HAL_DCACHE_LINE_SIZE;
103
        way3 += HAL_DCACHE_LINE_SIZE;
104
    }
105
    if (state)
106
        HAL_DCACHE_ENABLE();
107
}
108
#endif
109
 
110
/*------------------------------------------------------------------------*/
111
/* Clock functions.                                                       */
112
 
113
cyg_uint32 __hal_period__;
114
 
115
// Delay for some usecs.
116
void
117
hal_delay_us(cyg_int32 delay)
118
{
119
#define _TICKS_PER_USEC (CYGHWR_HAL_MN10300_PROCESSOR_OSC/1000000)
120
    cyg_uint32 now, prev, diff, usecs;
121
 
122
    diff = usecs = 0;
123
    HAL_CLOCK_READ(&prev);
124
 
125
    while (delay > usecs) {
126
        HAL_CLOCK_READ(&now);
127
 
128
        if (now < prev)
129
            diff += (now + (__hal_period__ - prev));
130
        else
131
            diff += (now - prev);
132
 
133
        prev = now;
134
 
135
        if (diff >= _TICKS_PER_USEC) {
136
            usecs += (diff / _TICKS_PER_USEC);
137
            diff %= _TICKS_PER_USEC;
138
        }
139
    }
140
}
141
 
142
 
143
/*------------------------------------------------------------------------*/
144
/* Memory top support                                                     */
145
 
146
#define SDBASE0       ((volatile unsigned *)0xDA000008)
147
#define SDBASE1       ((volatile unsigned *)0xDA00000C)
148
#define SDRAMBUS      ((volatile unsigned *)0xDA000000)
149
 
150
#if CYGINT_HAL_MN10300_MEM_REAL_REGION_TOP
151
externC cyg_uint8 *
152
hal_mn10300_mem_real_region_top( cyg_uint8 *regionend )
153
{
154
    unsigned dram_size, dram_base;
155
 
156
    // Figure out actual DRAM size from memory controller config.
157
    dram_size = 0x400000 << ((*SDRAMBUS >> 16) & 0x3);
158
    if (*SDBASE1 & 1)
159
        dram_size *= 2;
160
    dram_base = (*SDBASE0 & ((*SDBASE0 & 0xfff0) << 16));
161
 
162
    CYG_ASSERT( dram_size >= 8<<20, "Less than 8MB SDRAM reported!" );
163
    CYG_ASSERT( dram_size <=  256<<20, "More than 256MB SDRAM reported!" );
164
 
165
    // is it the "normal" end of the DRAM region? If so, it should be
166
    // replaced by the real size
167
    if ( regionend ==
168
         ((cyg_uint8 *)CYGMEM_REGION_ram + CYGMEM_REGION_ram_SIZE) ) {
169
        regionend = (cyg_uint8 *)dram_base + dram_size;
170
    }
171
    return regionend;
172
}
173
#endif
174
 
175
 
176
#ifdef CYGPKG_CYGMON
177
/*------------------------------------------------------------------------*/
178
/* GDB Register functions.                                                */
179
#include <cyg/hal/var_arch.h>
180
#include <cyg/hal/hal_stub.h>
181
 
182
#if CYGHWR_HAL_MN10300_AM33_REVISION == 2
183
int fpu_regs_read = 0;
184
#endif
185
 
186
int msp_read = 0;
187
 
188
extern int *_registers_valid;
189
 
190
void am33_get_gdb_extra_registers(CYG_ADDRWORD *registers, HAL_SavedRegisters *regs)
191
{
192
  register CYG_ADDRWORD epsw;
193
  asm volatile ("  mov epsw, %0 " : "=r" (epsw) : );
194
 
195
  registers[15] = regs->e0;
196
  registers[16] = regs->e1;
197
  registers[17] = regs->e2;
198
  registers[18] = regs->e3;
199
  registers[19] = regs->e4;
200
  registers[20] = regs->e5;
201
  registers[21] = regs->e6;
202
  registers[22] = regs->e7;
203
 
204
  registers[26] = regs->mcrh;
205
  registers[27] = regs->mcrl;
206
  registers[28] = regs->mcvf;
207
 
208
  registers[14] = regs->mdrq;
209
 
210
  {
211
    register CYG_ADDRWORD ssp, usp, msp;
212
    asm volatile (" mov usp,  %0 " : "=a" (usp) : );
213
    asm volatile (" mov ssp,  %0 " : "=a" (ssp) : );
214
    if ((epsw & HAL_ARCH_AM33_PSW_ML) == HAL_ARCH_AM33_PSW_ML)
215
      {
216
        // We are running in Monitor mode.  Go ahead and read the MSP.
217
        asm volatile (" mov msp, %0 " : "=a" (msp) : );
218
        msp_read = 1;
219
      } else {
220
        msp = 0;
221
        msp_read = 0;
222
      }
223
 
224
    // Now we need to determine which sp was in effect when we hit this exception,
225
    // since we want the register image to reflect the state at the time of the
226
    // exception.
227
    if ((regs->psw & HAL_ARCH_AM33_PSW_ML) == HAL_ARCH_AM33_PSW_ML)
228
      {
229
        msp = regs->sp;
230
      }
231
    else if ((regs->psw & HAL_ARCH_AM33_PSW_nSL) == 0)
232
      {
233
        ssp = regs->sp;
234
      }
235
    else
236
      {
237
        usp = regs->sp;
238
      }
239
 
240
    registers[23] = ssp;
241
    registers[24] = msp;
242
    registers[25] = usp;
243
  }
244
 
245
#if CYGHWR_HAL_MN10300_AM33_REVISION == 2
246
  if ((regs->psw & HAL_ARCH_AM33_PSW_FE) == HAL_ARCH_AM33_PSW_FE)
247
    {
248
      // The FPU is enabled.  Go ahead and read the registers
249
      asm volatile (" fmov fpcr, %0  " : "=d" (registers[29]) : );
250
      asm volatile (" fmov fs0,  %0  " : "=m" (registers[32]) : );
251
      asm volatile (" fmov fs1,  %0  " : "=m" (registers[33]) : );
252
      asm volatile (" fmov fs2,  %0  " : "=m" (registers[34]) : );
253
      asm volatile (" fmov fs3,  %0  " : "=m" (registers[35]) : );
254
      asm volatile (" fmov fs4,  %0  " : "=m" (registers[36]) : );
255
      asm volatile (" fmov fs5,  %0  " : "=m" (registers[37]) : );
256
      asm volatile (" fmov fs6,  %0  " : "=m" (registers[38]) : );
257
      asm volatile (" fmov fs7,  %0  " : "=m" (registers[39]) : );
258
      asm volatile (" fmov fs8,  %0  " : "=m" (registers[40]) : );
259
      asm volatile (" fmov fs9,  %0  " : "=m" (registers[41]) : );
260
      asm volatile (" fmov fs10, %0  " : "=m" (registers[42]) : );
261
      asm volatile (" fmov fs11, %0  " : "=m" (registers[43]) : );
262
      asm volatile (" fmov fs12, %0  " : "=m" (registers[44]) : );
263
      asm volatile (" fmov fs13, %0  " : "=m" (registers[45]) : );
264
      asm volatile (" fmov fs14, %0  " : "=m" (registers[46]) : );
265
      asm volatile (" fmov fs15, %0  " : "=m" (registers[47]) : );
266
      asm volatile (" fmov fs16, %0  " : "=m" (registers[48]) : );
267
      asm volatile (" fmov fs17, %0  " : "=m" (registers[49]) : );
268
      asm volatile (" fmov fs18, %0  " : "=m" (registers[50]) : );
269
      asm volatile (" fmov fs19, %0  " : "=m" (registers[51]) : );
270
      asm volatile (" fmov fs20, %0  " : "=m" (registers[52]) : );
271
      asm volatile (" fmov fs21, %0  " : "=m" (registers[53]) : );
272
      asm volatile (" fmov fs22, %0  " : "=m" (registers[54]) : );
273
      asm volatile (" fmov fs23, %0  " : "=m" (registers[55]) : );
274
      asm volatile (" fmov fs24, %0  " : "=m" (registers[56]) : );
275
      asm volatile (" fmov fs25, %0  " : "=m" (registers[57]) : );
276
      asm volatile (" fmov fs26, %0  " : "=m" (registers[58]) : );
277
      asm volatile (" fmov fs27, %0  " : "=m" (registers[59]) : );
278
      asm volatile (" fmov fs28, %0  " : "=m" (registers[60]) : );
279
      asm volatile (" fmov fs29, %0  " : "=m" (registers[61]) : );
280
      asm volatile (" fmov fs30, %0  " : "=m" (registers[62]) : );
281
      asm volatile (" fmov fs31, %0  " : "=m" (registers[63]) : );
282
      fpu_regs_read = 1;
283
    } else {
284
      fpu_regs_read = 0;
285
    }
286
#endif
287
 
288
#ifdef CYGHWR_REGISTER_VALIDITY_CHECKING
289
  {
290
    int i;
291
 
292
    // Initially set all registers to valid
293
    for (i = 0; i < NUMREGS; i++)
294
      _registers_valid[i] = 1;
295
 
296
    if (msp_read == 0)
297
      _registers_valid[MSP] = 0;
298
 
299
    if (fpu_regs_read == 0)
300
      {
301
        for (i = FP_START; i <= FP_END; i++)
302
          _registers_valid[i] = 0;
303
      }
304
  }
305
#endif
306
}
307
 
308
void am33_set_gdb_extra_registers(CYG_ADDRWORD *registers, HAL_SavedRegisters *regs)
309
{
310
  regs->e0 = registers[15];
311
  regs->e1 = registers[16];
312
  regs->e2 = registers[17];
313
  regs->e3 = registers[18];
314
  regs->e4 = registers[19];
315
  regs->e5 = registers[20];
316
  regs->e6 = registers[21];
317
  regs->e7 = registers[22];
318
 
319
  regs->mcrh = registers[26];
320
  regs->mcrl = registers[27];
321
  regs->mcvf = registers[28];
322
 
323
  regs->mdrq = registers[14];
324
 
325
  {
326
    register CYG_ADDRWORD ssp, usp, msp;
327
    ssp = registers[23];
328
    msp = registers[24];
329
    usp = registers[25];
330
    if ((registers[11] & HAL_ARCH_AM33_PSW_ML) == HAL_ARCH_AM33_PSW_ML)
331
      {
332
        // We were running in monitor mode.
333
        // Go ahead and manually restore ssp and usp.
334
        // msp will be restored by the rti.
335
        asm volatile (" mov %0, usp " : : "a" (usp));
336
        asm volatile (" mov %0, ssp " : : "a" (ssp));
337
      }
338
    else if ((registers[11] & HAL_ARCH_AM33_PSW_nSL) == 0)
339
      {
340
        // We were running in system mode.
341
        // Go ahead and manually restore msp and usp.
342
        // ssp will be restored by the rti.
343
        asm volatile (" mov %0, usp " : : "a" (usp));
344
        if (msp_read)
345
          {
346
          asm volatile (" mov %0, msp " : : "a" (msp));
347
          }
348
      }
349
    else
350
      {
351
        // We were running in user mode.
352
        // Go ahead and manually restore msp and ssp.
353
        // usp will be restored by the rti.
354
        asm volatile (" mov %0, ssp " : : "a" (ssp));
355
        if (msp_read)
356
          {
357
          asm volatile (" mov %0, msp " : : "a" (msp));
358
          }
359
      }
360
  }
361
 
362
#if CYGHWR_HAL_MN10300_AM33_REVISION == 2
363
  if (fpu_regs_read)
364
    {
365
      // The FPU registers have been read and the FPU is enabled.
366
      // Go ahead and write the registers
367
      asm volatile (" fmov %0, fpcr  " : : "d" (registers[29]) );
368
      asm volatile (" fmov %0, fs0   " : : "m" (registers[32]) );
369
      asm volatile (" fmov %0, fs1   " : : "m" (registers[33]) );
370
      asm volatile (" fmov %0, fs2   " : : "m" (registers[34]) );
371
      asm volatile (" fmov %0, fs3   " : : "m" (registers[35]) );
372
      asm volatile (" fmov %0, fs4   " : : "m" (registers[36]) );
373
      asm volatile (" fmov %0, fs5   " : : "m" (registers[37]) );
374
      asm volatile (" fmov %0, fs6   " : : "m" (registers[38]) );
375
      asm volatile (" fmov %0, fs7   " : : "m" (registers[39]) );
376
      asm volatile (" fmov %0, fs8   " : : "m" (registers[40]) );
377
      asm volatile (" fmov %0, fs9   " : : "m" (registers[41]) );
378
      asm volatile (" fmov %0, fs10  " : : "m" (registers[42]) );
379
      asm volatile (" fmov %0, fs11  " : : "m" (registers[43]) );
380
      asm volatile (" fmov %0, fs12  " : : "m" (registers[44]) );
381
      asm volatile (" fmov %0, fs13  " : : "m" (registers[45]) );
382
      asm volatile (" fmov %0, fs14  " : : "m" (registers[46]) );
383
      asm volatile (" fmov %0, fs15  " : : "m" (registers[47]) );
384
      asm volatile (" fmov %0, fs16  " : : "m" (registers[48]) );
385
      asm volatile (" fmov %0, fs17  " : : "m" (registers[49]) );
386
      asm volatile (" fmov %0, fs18  " : : "m" (registers[50]) );
387
      asm volatile (" fmov %0, fs19  " : : "m" (registers[51]) );
388
      asm volatile (" fmov %0, fs20  " : : "m" (registers[52]) );
389
      asm volatile (" fmov %0, fs21  " : : "m" (registers[53]) );
390
      asm volatile (" fmov %0, fs22  " : : "m" (registers[54]) );
391
      asm volatile (" fmov %0, fs23  " : : "m" (registers[55]) );
392
      asm volatile (" fmov %0, fs24  " : : "m" (registers[56]) );
393
      asm volatile (" fmov %0, fs25  " : : "m" (registers[57]) );
394
      asm volatile (" fmov %0, fs26  " : : "m" (registers[58]) );
395
      asm volatile (" fmov %0, fs27  " : : "m" (registers[59]) );
396
      asm volatile (" fmov %0, fs28  " : : "m" (registers[60]) );
397
      asm volatile (" fmov %0, fs29  " : : "m" (registers[61]) );
398
      asm volatile (" fmov %0, fs30  " : : "m" (registers[62]) );
399
      asm volatile (" fmov %0, fs31  " : : "m" (registers[63]) );
400
    }
401
#endif
402
}
403
#endif // CYGPKG_CYGMON
404
 
405
/*------------------------------------------------------------------------*/
406
/* End of var_misc.c                                                      */

powered by: WebSVN 2.1.0

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