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

Subversion Repositories or1k

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

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

powered by: WebSVN 2.1.0

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