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

Subversion Repositories or1k

[/] [or1k/] [branches/] [newlib/] [newlib/] [libgloss/] [mips/] [pmon.S] - Blame information for rev 39

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

Line No. Rev Author Line
1 39 lampret
/*
2
 * pmon.S -- low-level entry points into PMON monitor.
3
 *
4
 * Copyright (c) 1996, 1997 Cygnus Support
5
 *
6
 * The authors hereby grant permission to use, copy, modify, distribute,
7
 * and license this software and its documentation for any purpose, provided
8
 * that existing copyright notices are retained in all copies and that this
9
 * notice is included verbatim in any distributions. No written agreement,
10
 * license, or royalty fee is required for any of the authorized uses.
11
 * Modifications to this software may be copyrighted by their authors
12
 * and need not follow the licensing terms described here, provided that
13
 * the new terms are clearly indicated on the first page of each file where
14
 * they apply.
15
 */
16
 
17
#ifdef __mips16
18
/* This file contains 32 bit assembly code.  */
19
        .set nomips16
20
#endif
21
 
22
#if __mips < 3
23
  /* This machine does not support 64-bit operations.  */
24
  #define ADDU addu
25
  #define SUBU subu
26
#else
27
  /* This machine supports 64-bit operations.  */
28
  #define ADDU daddu
29
  #define SUBU dsubu
30
#endif
31
 
32
#include "regs.S"
33
 
34
        .text
35
        .align  2
36
 
37
#ifdef LSI
38
  #define PMON_VECTOR 0xffffffffbfc00200
39
#else
40
  #define PMON_VECTOR 0xffffffffbfc00500
41
#endif
42
 
43
#ifndef __mips_eabi
44
/* Provide named functions for entry into the monitor: */
45
#define INDIRECT(name,index)                            \
46
        .globl  name;                                   \
47
        .ent    name;                                   \
48
        .set    noreorder;                              \
49
name:   la      $2,+(PMON_VECTOR+((index)*4));          \
50
        lw      $2,0($2);                               \
51
        j       $2;                                     \
52
        nop;                                            \
53
        .set    reorder;                                \
54
        .end    name
55
 
56
#else
57
#define INDIRECT(name,index)                            \
58
        .globl  name;                                   \
59
        .ent    name;                                   \
60
        .set    noreorder;                              \
61
name:   la      $2,+(PMON_VECTOR+((index)*4));          \
62
        lw      $2,0($2);                               \
63
        SUBU    sp,sp,0x40;                             \
64
        sd      ra,0x38(sp);                            \
65
        sd      fp,0x30(sp);                            \
66
        jal     $2;                                     \
67
        move    fp,sp;                                  \
68
        ld      ra,0x38(sp);                            \
69
        ld      fp,0x30(sp);                            \
70
        j       ra;                                     \
71
        ADDU    sp,sp,0x40;                             \
72
        .set    reorder;                                \
73
        .end    name
74
#endif
75
 
76
 
77
/* The following magic numbers are for the slots into the PMON monitor */
78
/* The first are used as the lo-level library run-time: */
79
INDIRECT(read,0)
80
INDIRECT(write,1)
81
INDIRECT(open,2)
82
INDIRECT(close,3)
83
/* The following are useful monitor routines: */
84
INDIRECT(mon_ioctl,4)
85
INDIRECT(mon_printf,5)
86
INDIRECT(mon_vsprintf,6)
87
INDIRECT(mon_ttctl,7)
88
INDIRECT(mon_cliexit,8)
89
INDIRECT(mon_getenv,9)
90
INDIRECT(mon_onintr,10)
91
INDIRECT(mon_flush_cache,11)
92
INDIRECT(_flush_cache,11)
93
INDIRECT(mon_exception,12)
94
 
95
/* The following routine is required by the "print()" function: */
96
        .globl  outbyte
97
        .ent    outbyte
98
        .set    noreorder
99
outbyte:
100
        subu    sp,sp,0x20      /* allocate stack space for string */
101
        sd      ra,0x18(sp)     /* stack return address */
102
        sd      fp,0x10(sp)     /* stack frame-pointer */
103
        move    fp,sp           /* take a copy of the stack pointer */
104
        /* We leave so much space on the stack for the string (16
105
           characters), since the call to mon_printf seems to corrupt
106
           the 8bytes at offset 8 into the string/stack. */
107
        sb      a0,0x00(sp)     /* character to print */
108
        sb      z0,0x01(sp)     /* NUL terminator */
109
        jal     mon_printf      /* and output the string */
110
        move    a0,sp           /* take a copy of the string pointer {DELAY SLOT} */
111
 
112
        move    sp,fp           /* recover stack pointer */
113
        ld      ra,0x18(sp)     /* recover return address */
114
        ld      fp,0x10(sp)     /* recover frame-pointer */
115
        j       ra              /* return to the caller */
116
        addu    sp,sp,0x20      /* dump the stack space {DELAY SLOT} */
117
        .set    reorder
118
        .end    outbyte
119
 
120
/* The following routine is required by the "sbrk()" function: */
121
        .globl  get_mem_info
122
        .ent    get_mem_info
123
        .set    noreorder
124
get_mem_info:
125
        # in:  a0 = pointer to 3 word structure
126
        # out: void
127
        subu    sp,sp,0x18      /* create some stack space */
128
        sd      ra,0x00(sp)     /* stack return address */
129
        sd      fp,0x08(sp)     /* stack frame-pointer */
130
        sd      a0,0x10(sp)     /* stack structure pointer */
131
        move    fp,sp           /* take a copy of the stack pointer */
132
 
133
        # The monitor has already sized memory, but unfortunately we
134
        # do not have access to the data location containing the
135
        # memory size.
136
 
137
        jal     __sizemem
138
        nop
139
 
140
        ld      a0,0x10(sp)     # recover structure pointer
141
        sw      v0,0(a0)        # amount of memory available
142
 
143
        # Deal with getting the cache size information:
144
        mfc0    a1, C0_CONFIG
145
        nop
146
        nop
147
        andi    a2,a1,0x7 << 9  # bits 11..9 for instruction cache size
148
        sll     a2,a2,12 - 8
149
        sw      a2,4(a0)
150
        andi    a2,a1,0x7 << 6  # bits 8..6 for data cache size
151
        sll     a2,a2,12 - 5
152
        sw      a2,8(a0)        # data cache size
153
        #
154
        move    sp,fp           /* recover stack pointer */
155
        ld      ra,0x00(sp)     /* recover return address */
156
        ld      fp,0x08(sp)     /* recover frame-pointer */
157
        j       ra              /* return to the caller */
158
        addu    sp,sp,0x18      /* restore stack pointer {DELAY SLOT} */
159
        .set    reorder
160
        .end    get_mem_info
161
 
162
#ifdef LSI
163
 
164
# For the LSI MiniRISC board, we can safely assume that we have
165
# at least one megabyte of RAM.
166
 
167
        .globl  __sizemem
168
        .ent    __sizemem
169
__sizemem:
170
        li      v0,0x100000
171
        j       ra
172
        .end    __sizemem
173
#else
174
 
175
 
176
#endif
177
/* EOF pmon.S */

powered by: WebSVN 2.1.0

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