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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [orpmon/] [common/] [support.c] - Blame information for rev 858

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

Line No. Rev Author Line
1 809 simons
/* Support */
2
 
3
#include "spr_defs.h"
4
#include "support.h"
5 833 simons
#include "common.h"
6 809 simons
#include "int.h"
7
 
8 833 simons
volatile unsigned long timestamp = 0;
9 809 simons
 
10
void int_main(void);
11
 
12
/* return value by making a syscall */
13
void exit (int i)
14
{
15
  asm("l.add r3,r0,%0": : "r" (i));
16
  asm("l.nop %0": :"K" (NOP_EXIT));
17
  while (1);
18
}
19
 
20
/* activate printf support in simulator */
21
void __printf(const char *fmt, ...)
22
{
23
 
24
  va_list args;
25
  va_start(args, fmt);
26
  __asm__ __volatile__ ("  l.addi\tr3,%1,0\n \
27
                           l.addi\tr4,%2,0\n \
28
                           l.nop %0": :"K" (NOP_PRINTF), "r" (fmt), "r"  (args) : "r3", "r4");
29
}
30
 
31
/* print long */
32
void report(unsigned long value)
33
{
34
  asm("l.addi\tr3,%0,0": :"r" (value));
35
  asm("l.nop %0": :"K" (NOP_REPORT));
36
}
37
 
38
/* just to satisfy linker */
39
void __main(void)
40
{
41
}
42
 
43
/* For writing into SPR. */
44
void mtspr(unsigned long spr, unsigned long value)
45
{
46
  asm("l.mtspr\t\t%0,%1,0": : "r" (spr), "r" (value));
47
}
48
 
49
/* For reading SPR. */
50
unsigned long mfspr(unsigned long spr)
51
{
52
  unsigned long value;
53
  asm("l.mfspr\t\t%0,%1,0" : "=r" (value) : "r" (spr));
54
  return value;
55
}
56
 
57 816 markom
void *memcpy (void *dstv, const void *srcv, unsigned long length)
58 809 simons
{
59 816 markom
  char *dst = dstv;
60
  const char *src = (const char *) srcv;
61 809 simons
 
62
  while (length--)
63
    *dst++ = *src++;
64
  return dst;
65
}
66
 
67 816 markom
void *memmove (void *dstv, const void *srcv, unsigned long length)
68 809 simons
{
69 816 markom
  char *dst = dstv;
70
  const char *src = srcv;
71 809 simons
 
72 816 markom
  /* Copy backwards? */
73
  if (src < dst && dst < src + length) {
74
    src += length;
75
    dst += length;
76
    while (length--) *--dst = *--src;
77
    return dstv;
78
        } else return memcpy (dstv, srcv, length);
79
}
80
 
81
int memcmp (void *dstv, const void *srcv, unsigned long length)
82
{
83
  char *dst = dstv;
84
  const char *src = (const char *) srcv;
85
 
86 809 simons
  while (length--)
87 816 markom
    if(*dst++ != *src++) {
88 809 simons
      if(*(--dst) > *(--src))
89
        return 1;
90
      else
91
        return -1;
92 816 markom
    }
93 809 simons
  return 1;
94
}
95
 
96 858 markom
void *memset (void *dstvoid, const char data, unsigned long length)
97 809 simons
{
98
  char *dst = dstvoid;
99
  while (length--) *dst++ = data;
100
  return dst;
101
}
102
 
103 858 markom
void *memchr(const void *s, int c, unsigned long n)
104
{
105
  char *sc = (char *)s;
106
  int i;
107
  for (i = 0; i < n; i++)
108
    if (*sc == c) return sc;
109
    else sc++;
110
  return sc;
111
}
112
 
113 816 markom
int strlen (const char *src)
114 809 simons
{
115
  int len = 0;
116 816 markom
  while (*src++) len++;
117 809 simons
  return len;
118
}
119
 
120
int strcmp (const char *s1, const char *s2)
121
{
122
  while (*s1 != '\0' && *s1 == *s2) {
123
    s1++;
124
    s2++;
125
  }
126
  return (*(unsigned char *) s1) - (*(unsigned char *) s2);
127
}
128
 
129
char *strcpy (char *dst0, char *src0)
130
{
131
  char *s = dst0;
132
  while ((*dst0++ = *src0++));
133
  return s;
134
}
135
 
136
void reset_timer (void)
137
{
138
  timestamp = 0;
139
}
140 816 markom
 
141
/* Parses hex or decimal number */
142
unsigned long strtoul (const char *str, char **endptr, int base)
143
{
144
  unsigned long number = 0;
145
  char *pos = (char *) str;
146
  char *fail_char = (char *) str;
147
 
148
  while (isspace(*pos)) pos++;  /* skip leading whitespace */
149
 
150
  if ((base == 16) && (*pos == '0')) { /* handle option prefix */
151
    ++pos;
152
    fail_char = pos;
153
    if ((*pos == 'x') || (*pos == 'X')) ++pos;
154
  }
155
 
156
  if (base == 0) {               /* dynamic base */
157
    base = 10;          /* default is 10 */
158
    if (*pos == '0') {
159
      ++pos;
160
      base -= 2;                /* now base is 8 (or 16) */
161
      fail_char = pos;
162
      if ((*pos == 'x') || (*pos == 'X')) {
163
        base += 8;      /* base is 16 */
164
        ++pos;
165
      }
166
    }
167
  }
168
 
169
  if ((base < 2) || (base > 36)) goto done; /* illegal base */
170
 
171
  while (1) {
172
    int digit = 40;
173
    if ((*pos >= '0') && (*pos <= '9')) {
174
        digit = (*pos - '0');
175
    } else if (*pos >= 'a') {
176
        digit = (*pos - 'a' + 10);
177
    } else if (*pos >= 'A') {
178
        digit = (*pos - 'A' + 10);
179
    } else break;
180
 
181
    if (digit >= base) break;
182
 
183
    fail_char = ++pos;
184
    number = number * base + digit;
185
  }
186
 
187
done:
188
  if (endptr) *endptr = fail_char;
189
  return number;
190
}
191 809 simons
 
192
unsigned long get_timer (unsigned long base)
193
{
194 833 simons
__printf("%s - %s: %d\n", __FILE__, __FUNCTION__, __LINE__);
195
__printf("   timestamp = %.8lx base = %.8lx\n", timestamp, base);
196 809 simons
  return (timestamp - base);
197
}
198
 
199
void set_timer (unsigned long t)
200
{
201
  timestamp = t;
202
}
203
 

powered by: WebSVN 2.1.0

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