File indexing completed on 2025-05-11 08:23:51
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #ifdef __mips16
0018
0019 .set nomips16
0020 #endif
0021
0022 #if __mips < 3
0023
0024 #define ADDU addu
0025 #define SUBU subu
0026 #else
0027
0028 #define ADDU daddu
0029 #define SUBU dsubu
0030 #endif
0031
0032 #include <bsp/regs.h>
0033
0034 .text
0035 .align 2
0036
0037 #ifdef LSI
0038 #define PMON_VECTOR 0xbfc00200
0039 #else
0040 #define PMON_VECTOR 0xbfc00500
0041 #endif
0042
0043 #ifndef __mips_eabi
0044
0045 #define INDIRECT(name,index) \
0046 .globl name; \
0047 .ent name; \
0048 .set noreorder; \
0049 name: la $2,+(PMON_VECTOR+((index)*4)); \
0050 lw $2,0($2); \
0051 j $2; \
0052 nop; \
0053 .set reorder; \
0054 .end name
0055
0056 #else
0057 #define INDIRECT(name,index) \
0058 .globl name; \
0059 .ent name; \
0060 .set noreorder; \
0061 name: la $2,+(PMON_VECTOR+((index)*4)); \
0062 lw $2,0($2); \
0063 SUBU sp,sp,0x40; \
0064 sd ra,0x38(sp); \
0065 sd fp,0x30(sp); \
0066 jal $2; \
0067 move fp,sp; \
0068 ld ra,0x38(sp); \
0069 ld fp,0x30(sp); \
0070 j ra; \
0071 ADDU sp,sp,0x40; \
0072 .set reorder; \
0073 .end name
0074 #endif
0075
0076
0077
0078
0079 INDIRECT(mon_read,0)
0080 INDIRECT(mon_write,1)
0081 INDIRECT(mon_open,2)
0082 INDIRECT(mon_close,3)
0083
0084 INDIRECT(mon_ioctl,4)
0085 INDIRECT(mon_printf,5)
0086 INDIRECT(mon_vsprintf,6)
0087 INDIRECT(mon_ttctl,7)
0088 INDIRECT(mon_cliexit,8)
0089 INDIRECT(mon_getenv,9)
0090 INDIRECT(mon_onintr,10)
0091 INDIRECT(mon_flush_cache,11)
0092 INDIRECT(mon_exception,12)
0093 INDIRECT(mon_fpgaconfig,21)
0094
0095 #if 0
0096
0097
0098 .globl pmon_outbyte
0099 .ent pmon_outbyte
0100 .set noreorder
0101 pmon_outbyte:
0102 subu sp,sp,0x20
0103 sd ra,0x18(sp)
0104 sd fp,0x10(sp)
0105 move fp,sp
0106
0107
0108
0109 sb a0,0x00(sp)
0110 sb z0,0x01(sp)
0111 jal mon_printf
0112 move a0,sp
0113
0114 move sp,fp
0115 ld ra,0x18(sp)
0116 ld fp,0x10(sp)
0117 j ra
0118 addu sp,sp,0x20
0119 .set reorder
0120 .end pmon_outbyte
0121
0122
0123 .globl get_mem_info
0124 .ent get_mem_info
0125 .set noreorder
0126 get_mem_info:
0127 # in: a0 = pointer to 3 word structure
0128 # out: void
0129 subu sp,sp,0x18
0130 sd ra,0x00(sp)
0131 sd fp,0x08(sp)
0132 sd a0,0x10(sp)
0133 move fp,sp
0134
0135 # The monitor has already sized memory, but unfortunately we
0136 # do not have access to the data location containing the
0137 # memory size.
0138
0139 jal __sizemem
0140 nop
0141
0142 ld a0,0x10(sp) # recover structure pointer
0143 sw v0,0(a0) # amount of memory available
0144
0145 # Deal with getting the cache size information:
0146 mfc0 a1, C0_CONFIG
0147 nop
0148 nop
0149 andi a2,a1,0x7 << 9 # bits 11..9 for instruction cache size
0150 sll a2,a2,12 - 8
0151 sw a2,4(a0)
0152 andi a2,a1,0x7 << 6 # bits 8..6 for data cache size
0153 sll a2,a2,12 - 5
0154 sw a2,8(a0) # data cache size
0155 #
0156 move sp,fp
0157 ld ra,0x00(sp)
0158 ld fp,0x08(sp)
0159 j ra
0160 addu sp,sp,0x18
0161 .set reorder
0162 .end get_mem_info
0163
0164 #ifdef LSI
0165
0166 # For the LSI MiniRISC board, we can safely assume that we have
0167 # at least one megabyte of RAM.
0168
0169 .globl __sizemem
0170 .ent __sizemem
0171 __sizemem:
0172 li v0,0x100000
0173 j ra
0174 .end __sizemem
0175 #else
0176
0177 #endif
0178
0179 #endif
0180