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

Subversion Repositories or1k

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

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

Line No. Rev Author Line
1 809 simons
/* Support */
2
 
3
#include <sys/time.h>
4
#include "spr_defs.h"
5
#include "support.h"
6
#include "int.h"
7
 
8
unsigned long timestamp = 0;
9
 
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 816 markom
void *memchr (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 816 markom
int strlen (const char *src)
104 809 simons
{
105
  int len = 0;
106 816 markom
  while (*src++) len++;
107 809 simons
  return len;
108
}
109
 
110
int strcmp (const char *s1, const char *s2)
111
{
112
  while (*s1 != '\0' && *s1 == *s2) {
113
    s1++;
114
    s2++;
115
  }
116
  return (*(unsigned char *) s1) - (*(unsigned char *) s2);
117
}
118
 
119
char *strcpy (char *dst0, char *src0)
120
{
121
  char *s = dst0;
122
  while ((*dst0++ = *src0++));
123
  return s;
124
}
125
 
126
void reset_timer (void)
127
{
128
  timestamp = 0;
129
}
130 816 markom
 
131
/* Parses hex or decimal number */
132
unsigned long strtoul (const char *str, char **endptr, int base)
133
{
134
  unsigned long number = 0;
135
  char *pos = (char *) str;
136
  char *fail_char = (char *) str;
137
 
138
  while (isspace(*pos)) pos++;  /* skip leading whitespace */
139
 
140
  if ((base == 16) && (*pos == '0')) { /* handle option prefix */
141
    ++pos;
142
    fail_char = pos;
143
    if ((*pos == 'x') || (*pos == 'X')) ++pos;
144
  }
145
 
146
  if (base == 0) {               /* dynamic base */
147
    base = 10;          /* default is 10 */
148
    if (*pos == '0') {
149
      ++pos;
150
      base -= 2;                /* now base is 8 (or 16) */
151
      fail_char = pos;
152
      if ((*pos == 'x') || (*pos == 'X')) {
153
        base += 8;      /* base is 16 */
154
        ++pos;
155
      }
156
    }
157
  }
158
 
159
  if ((base < 2) || (base > 36)) goto done; /* illegal base */
160
 
161
  while (1) {
162
    int digit = 40;
163
    if ((*pos >= '0') && (*pos <= '9')) {
164
        digit = (*pos - '0');
165
    } else if (*pos >= 'a') {
166
        digit = (*pos - 'a' + 10);
167
    } else if (*pos >= 'A') {
168
        digit = (*pos - 'A' + 10);
169
    } else break;
170
 
171
    if (digit >= base) break;
172
 
173
    fail_char = ++pos;
174
    number = number * base + digit;
175
  }
176
 
177
done:
178
  if (endptr) *endptr = fail_char;
179
  return number;
180
}
181 809 simons
 
182
unsigned long get_timer (unsigned long base)
183
{
184
  return (timestamp - base);
185
}
186
 
187
void set_timer (unsigned long t)
188
{
189
  timestamp = t;
190
}
191
 

powered by: WebSVN 2.1.0

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