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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [packages/] [cygmon/] [v2_0/] [misc/] [bsp/] [common/] [generic-mem.c] - Blame information for rev 361

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

Line No. Rev Author Line
1 27 unneback
//==========================================================================
2
//
3
//      generic-mem.c
4
//
5
//      Generic support for safe memory read/write.
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 Red Hat, 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 version.
16
//
17
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
19
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20
// for more details.
21
//
22
// You should have received a copy of the GNU General Public License along
23
// with eCos; if not, write to the Free Software Foundation, Inc.,
24
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
25
//
26
// As a special exception, if other files instantiate templates or use macros
27
// or inline functions from this file, or you compile this file and link it
28
// with other works to produce a work based on this file, this file does not
29
// by itself cause the resulting work to be covered by the GNU General Public
30
// License. However the source code for this file must still be made available
31
// in accordance with section (3) of the GNU General Public License.
32
//
33
// This exception does not invalidate any other reasons why a work based on
34
// this file might be covered by the GNU General Public License.
35
//
36
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37
// at http://sources.redhat.com/ecos/ecos-license/
38
// -------------------------------------------
39
//####ECOSGPLCOPYRIGHTEND####
40
//==========================================================================
41
//#####DESCRIPTIONBEGIN####
42
//
43
// Author(s):    
44
// Contributors: gthomas
45
// Date:         1999-10-20
46
// Purpose:      Generic support for safe memory read/write.
47
// Description:  Some targets may need to provide their own version.
48
//               
49
//
50
//####DESCRIPTIONEND####
51
//
52
//=========================================================================
53
 
54
#include <stdlib.h>
55
#include <setjmp.h>
56
#include <bsp/bsp.h>
57
 
58
typedef void (*moveproc_t)(void *s, void *d);
59
 
60
static jmp_buf __errjmp;
61
 
62
/*
63
 * These are globals because we want them preserved
64
 * across function calls.
65
 */
66
static bsp_handler_t __oldtrap;
67
static int __done;
68
 
69
 
70
static void
71
move_8(void *src, void *dest)
72
{
73
    *(char *)dest = *(char *)src;
74
}
75
 
76
 
77
static void
78
move_16(void *src, void *dest)
79
{
80
    *(short *)dest = *(short *)src;
81
}
82
 
83
 
84
static void
85
move_32(void *src, void *dest)
86
{
87
    *(int *)dest = *(int *)src;
88
}
89
 
90
 
91
static int
92
err_trap(int exc_nr, void *regs)
93
{
94
    longjmp(__errjmp, 1);
95
}
96
 
97
 
98
int
99
bsp_memory_read(void *addr,    /* start addr of memory to read */
100
                int  asid,     /* address space id */
101
                int  rsize,    /* size of individual read operation */
102
                int  nreads,   /* number of read operations */
103
                void *buf)     /* result buffer */
104
{
105
    if (nreads <= 0)
106
        return 0;
107
 
108
    __oldtrap = bsp_install_dbg_handler(err_trap);
109
 
110
    if (setjmp(__errjmp) == 0) {
111
        moveproc_t move_mem;
112
        int        incr;
113
        char       *src, *dest;
114
 
115
        switch (rsize) {
116
          case 8:
117
            move_mem = move_8;
118
            incr = 1;
119
            break;
120
          case 16:
121
            move_mem = move_16;
122
            incr = 2;
123
            break;
124
          case 32:
125
            move_mem = move_32;
126
            incr = 4;
127
            break;
128
          default:
129
            (void)bsp_install_dbg_handler(__oldtrap);
130
            return 0;
131
        }
132
 
133
        src = addr;
134
        dest = buf;
135
 
136
        for (__done = 0; __done < nreads; __done++) {
137
            move_mem(src, dest);
138
            src  += incr;
139
            dest += incr;
140
        }
141
    }
142
 
143
    (void)bsp_install_dbg_handler(__oldtrap);
144
    return __done;
145
}
146
 
147
 
148
int bsp_memory_write(void *addr,   /* start addr of memory to write */
149
                     int  asid,    /* address space id */
150
                     int  wsize,   /* size of individual write operation */
151
                     int  nwrites, /* number of write operations */
152
                     void *buf)    /* source buffer for write data */
153
{
154
    if (nwrites <= 0)
155
        return 0;
156
 
157
    __oldtrap = bsp_install_dbg_handler(err_trap);
158
 
159
    if (setjmp(__errjmp) == 0) {
160
        moveproc_t move_mem;
161
        int        incr;
162
        char       *src, *dest;
163
 
164
        switch (wsize) {
165
          case 8:
166
            move_mem = move_8;
167
            incr = 1;
168
            break;
169
          case 16:
170
            move_mem = move_16;
171
            incr = 2;
172
            break;
173
          case 32:
174
            move_mem = move_32;
175
            incr = 4;
176
            break;
177
          default:
178
            (void)bsp_install_dbg_handler(__oldtrap);
179
            return 0;
180
        }
181
 
182
        src = buf;
183
        dest = addr;
184
 
185
        for (__done = 0; __done < nwrites; __done++) {
186
            move_mem(src, dest);
187
            src  += incr;
188
            dest += incr;
189
        }
190
    }
191
 
192
    (void)bsp_install_dbg_handler(__oldtrap);
193
    return __done;
194
}

powered by: WebSVN 2.1.0

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