1 1.6 msaitoh /* $NetBSD: mon.h,v 1.6 2023/06/24 05:31:05 msaitoh Exp $ */ 2 1.1 fredette 3 1.1 fredette /*- 4 1.1 fredette * Copyright (c) 1996 The NetBSD Foundation, Inc. 5 1.1 fredette * All rights reserved. 6 1.1 fredette * 7 1.1 fredette * This code is derived from software contributed to The NetBSD Foundation 8 1.1 fredette * by Adam Glass. 9 1.1 fredette * 10 1.1 fredette * Redistribution and use in source and binary forms, with or without 11 1.1 fredette * modification, are permitted provided that the following conditions 12 1.1 fredette * are met: 13 1.1 fredette * 1. Redistributions of source code must retain the above copyright 14 1.1 fredette * notice, this list of conditions and the following disclaimer. 15 1.1 fredette * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 fredette * notice, this list of conditions and the following disclaimer in the 17 1.1 fredette * documentation and/or other materials provided with the distribution. 18 1.1 fredette * 19 1.1 fredette * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 fredette * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 fredette * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 fredette * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 fredette * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 fredette * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 fredette * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 fredette * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 fredette * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 fredette * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 fredette * POSSIBILITY OF SUCH DAMAGE. 30 1.1 fredette */ 31 1.1 fredette 32 1.1 fredette /* 33 1.1 fredette * This file derived from kernel/mach/sun3.md/machMon.h from the 34 1.1 fredette * sprite distribution. 35 1.1 fredette * 36 1.1 fredette * In particular, this file came out of the Walnut Creek cdrom collection 37 1.1 fredette * which contained no warnings about any possible copyright infringement. 38 1.6 msaitoh * It was also identical to a file in the sprite kernel tar file found on 39 1.1 fredette * allspice.berkeley.edu. 40 1.1 fredette * It also written in the annoying sprite coding style. I've made 41 1.1 fredette * efforts not to heavily edit their file, just ifdef parts out. -- glass 42 1.1 fredette */ 43 1.1 fredette 44 1.1 fredette #ifndef _MACHINE_MON_H 45 1.1 fredette #define _MACHINE_MON_H 46 1.1 fredette 47 1.1 fredette /* 48 1.1 fredette * machMon.h -- 49 1.1 fredette * 50 1.1 fredette * Structures, constants and defines for access to the sun monitor. 51 1.1 fredette * These are translated from the sun monitor header file "sunromvec.h". 52 1.1 fredette * 53 1.1 fredette * NOTE: The file keyboard.h in the monitor directory has all sorts of useful 54 1.1 fredette * keyboard stuff defined. I haven't attempted to translate that file 55 1.1 fredette * because I don't need it. If anyone wants to use it, be my guest. 56 1.1 fredette * 57 1.1 fredette * Copyright (C) 1985 Regents of the University of California 58 1.1 fredette * All rights reserved. 59 1.1 fredette * 60 1.1 fredette * 61 1.1 fredette * Header: /sprite/src/kernel/mach/sun3.md/RCS/machMon.h,v 9.1 62 1.1 fredette * 90/10/03 13:52:34 mgbaker Exp SPRITE (Berkeley) 63 1.1 fredette */ 64 1.1 fredette 65 1.1 fredette /* 66 1.1 fredette * Structure set up by the boot command to pass arguments to the program that 67 1.1 fredette * is booted. 68 1.1 fredette */ 69 1.1 fredette struct bootparam { 70 1.1 fredette char *argPtr[8]; /* String arguments */ 71 1.1 fredette char strings[100]; /* String table for string arguments */ 72 1.1 fredette char devName[2]; /* Device name */ 73 1.1 fredette int ctlrNum; /* Controller number */ 74 1.1 fredette int unitNum; /* Unit number */ 75 1.1 fredette int partNum; /* Partition/file number */ 76 1.1 fredette char *fileName; /* File name, points into strings */ 77 1.1 fredette struct boottab *bootDevice; /* Defined in saio.h */ 78 1.1 fredette } __attribute__((packed)); 79 1.1 fredette 80 1.1 fredette /* 81 1.1 fredette * This structure defines a segment of physical memory. To support 82 1.1 fredette * sparse physical memory, the PROM constructs a linked list of 83 1.1 fredette * these at power-on-self-test time. 84 1.1 fredette */ 85 1.1 fredette struct physmemory { 86 1.1 fredette u_int address; 87 1.1 fredette u_int size; 88 1.1 fredette struct physmemory *next; 89 1.1 fredette }; 90 1.1 fredette 91 1.1 fredette /* 92 1.1 fredette * Here is the structure of the vector table found at the front of the boot 93 1.1 fredette * rom. The functions defined in here are explained below. 94 1.1 fredette * 95 1.1 fredette * NOTE: This struct has references to the structures keybuf and globram which 96 1.1 fredette * I have not translated. If anyone needs to use these they should 97 1.1 fredette * translate these structs into Sprite format. 98 1.1 fredette */ 99 1.1 fredette struct sunromvec { 100 1.1 fredette char *init_SP; /* Initial SP for hardware */ 101 1.1 fredette char *init_PC; /* Initial PC for hardware */ 102 1.1 fredette int *diagberr; /* Bus err handler for diags */ 103 1.1 fredette 104 1.1 fredette /* 105 1.1 fredette * Monitor and hardware revision and identification 106 1.1 fredette */ 107 1.1 fredette 108 1.1 fredette struct bootparam **bootParam; /* Info for bootstrapped pgm */ 109 1.1 fredette u_int *memorySize; /* Usable memory in bytes */ 110 1.1 fredette 111 1.1 fredette /* 112 1.1 fredette * Single-character input and output 113 1.1 fredette */ 114 1.1 fredette 115 1.2 chs u_char (*getChar)(void); /* Get char from input source */ 116 1.2 chs int (*putChar)(int); /* Put char to output sink */ 117 1.2 chs int (*mayGet)(void); /* Maybe get char, or -1 */ 118 1.2 chs int (*mayPut)(int); /* Maybe put char, or -1 */ 119 1.1 fredette u_char *echo; /* Should getchar echo? */ 120 1.1 fredette u_char *inSource; /* Input source selector */ 121 1.1 fredette u_char *outSink; /* Output sink selector */ 122 1.1 fredette #define PROMDEV_KBD 0 /* input from keyboard */ 123 1.1 fredette #define PROMDEV_SCREEN 0 /* output to screen */ 124 1.1 fredette #define PROMDEV_TTYA 1 /* in/out to ttya */ 125 1.1 fredette #define PROMDEV_TTYB 2 /* in/out to ttyb */ 126 1.1 fredette 127 1.1 fredette /* 128 1.1 fredette * Keyboard input (scanned by monitor nmi routine) 129 1.1 fredette */ 130 1.1 fredette 131 1.2 chs int (*getKey)(void); /* Get next key if one exists */ 132 1.2 chs int (*initGetKey)(void *); /* Initialize get key */ 133 1.1 fredette u_int *translation; /* Kbd translation selector 134 1.1 fredette (see keyboard.h in sun 135 1.1 fredette monitor code) */ 136 1.1 fredette u_char *keyBid; /* Keyboard ID byte */ 137 1.1 fredette int *screen_x; /* V2: Screen x pos (R/O) */ 138 1.1 fredette int *screen_y; /* V2: Screen y pos (R/O) */ 139 1.1 fredette struct keybuf *keyBuf; /* Up/down keycode buffer */ 140 1.1 fredette 141 1.1 fredette /* 142 1.1 fredette * Monitor revision level. 143 1.1 fredette */ 144 1.1 fredette 145 1.1 fredette char *monId; 146 1.1 fredette 147 1.1 fredette /* 148 1.1 fredette * Frame buffer output and terminal emulation 149 1.1 fredette */ 150 1.1 fredette 151 1.2 chs int (*fbWriteChar)(int); /* Write a character to FB */ 152 1.1 fredette int *fbAddr; /* Address of frame buffer */ 153 1.1 fredette char **font; /* Font table for FB */ 154 1.1 fredette /* Quickly write string to FB */ 155 1.2 chs int (*fbWriteStr)(char *, int); 156 1.1 fredette 157 1.1 fredette /* 158 1.1 fredette * Reboot interface routine -- resets and reboots system. No return. 159 1.1 fredette */ 160 1.1 fredette 161 1.3 tsutsui int (*reBoot)(const char *); /* e.g. reBoot("xy()vmunix") */ 162 1.1 fredette 163 1.1 fredette /* 164 1.1 fredette * Line input and parsing 165 1.1 fredette */ 166 1.1 fredette 167 1.1 fredette u_char *lineBuf; /* The line input buffer */ 168 1.1 fredette u_char **linePtr; /* Cur pointer into linebuf */ 169 1.1 fredette int *lineSize; /* length of line in linebuf */ 170 1.2 chs int (*getLine)(int); /* Get line from user */ 171 1.2 chs u_char (*getNextChar)(void); /* Get next char from linebuf */ 172 1.2 chs u_char (*peekNextChar)(void); /* Peek at next char */ 173 1.1 fredette int *fbThere; /* =1 if frame buffer there */ 174 1.2 chs int (*getNum)(void); /* Grab hex num from line */ 175 1.1 fredette 176 1.1 fredette /* 177 1.1 fredette * Print formatted output to current output sink 178 1.1 fredette */ 179 1.1 fredette 180 1.3 tsutsui int (*printf)(const char *, ...); /* Like kernel printf */ 181 1.2 chs int (*printHex)(int, int); /* Format N digits in hex */ 182 1.1 fredette 183 1.1 fredette /* 184 1.1 fredette * Led stuff 185 1.1 fredette */ 186 1.1 fredette 187 1.1 fredette u_char *leds; /* RAM copy of LED register */ 188 1.2 chs int (*setLeds)(int); /* Sets LED's and RAM copy */ 189 1.1 fredette 190 1.1 fredette /* 191 1.1 fredette * Non-maskable interrupt (nmi) information 192 1.1 fredette */ 193 1.1 fredette 194 1.2 chs int (*nmiAddr)(void *); /* Addr for level 7 vector */ 195 1.2 chs int (*abortEntry)(void *); /* Entry for keyboard abort */ 196 1.1 fredette int *nmiClock; /* Counts up in msec */ 197 1.1 fredette 198 1.1 fredette /* 199 1.1 fredette * Frame buffer type: see <sun/fbio.h> 200 1.1 fredette */ 201 1.1 fredette 202 1.1 fredette int *fbType; 203 1.1 fredette 204 1.1 fredette /* 205 1.1 fredette * Assorted other things 206 1.1 fredette */ 207 1.1 fredette 208 1.1 fredette u_int romvecVersion; /* Version # of Romvec */ 209 1.1 fredette struct globram *globRam; /* monitor global variables */ 210 1.1 fredette void *kbdZscc; /* Addr of keyboard in use */ 211 1.1 fredette 212 1.1 fredette int *keyrInit; /* ms before kbd repeat */ 213 1.1 fredette u_char *keyrTick; /* ms between repetitions */ 214 1.1 fredette u_int *memoryAvail; /* V1: Main mem usable size */ 215 1.1 fredette long *resetAddr; /* where to jump on a reset */ 216 1.1 fredette long *resetMap; /* pgmap entry for resetaddr */ 217 1.1 fredette /* Really struct pgmapent * */ 218 1.2 chs int (*exitToMon)(void); /* Exit from user program */ 219 1.1 fredette u_char **memorybitmap; /* V1: &{0 or &bits} */ 220 1.1 fredette 221 1.1 fredette /**************************************************************** 222 1.1 fredette * Note: from here on, things vary per-architecture! 223 1.1 fredette ****************************************************************/ 224 1.1 fredette union { 225 1.1 fredette void *un_pad[8]; /* this determines the size */ 226 1.1 fredette struct { 227 1.1 fredette /* Set seg in all contexts (ctx, va, sme) */ 228 1.2 chs void (*un3_setcxsegmap)(int, int, int); 229 1.1 fredette /* V2: Handler for 'v' cmd */ 230 1.2 chs void (**un3_vector_cmd)(int, char *); 231 1.1 fredette } un3; 232 1.1 fredette struct { 233 1.1 fredette /* V2: Handler for 'v' cmd */ 234 1.2 chs void (**un3x_vector_cmd)(int, char *); 235 1.1 fredette /* Address of low memory PTEs (maps at least 4MB) */ 236 1.1 fredette int **un3x_lomemptaddr; 237 1.1 fredette /* 238 1.1 fredette * Address of debug/mon PTEs which map the 2MB space 239 1.1 fredette * starting at MON_KDB_BASE, ending at MONEND. 240 1.1 fredette */ 241 1.1 fredette int **un3x_monptaddr; 242 1.1 fredette /* 243 1.1 fredette * Address of dvma PTEs. This is a VA that maps the I/O MMU 244 1.1 fredette * page table, but only the last part, which corresponds to 245 1.1 fredette * the CPU virtual space at MON_DVMA_BASE (see below). 246 1.1 fredette */ 247 1.1 fredette int **un3x_dvmaptaddr; 248 1.1 fredette /* 249 1.1 fredette * Physical Address of the debug/mon PTEs found at the 250 1.1 fredette * virtual address given by *romVectorPtr->monptaddr; 251 1.1 fredette */ 252 1.1 fredette int **un3x_monptphysaddr; 253 1.1 fredette /* 254 1.1 fredette * Address of shadow copy of DVMA PTEs. This is a VA that 255 1.1 fredette * maps the PTEs used by the CPU to map the same physical 256 1.1 fredette * pages as the I/O MMU into the CPU virtual space starting 257 1.1 fredette * at MON_DVMA_BASE, length MON_DVMA_SIZE (see below). 258 1.1 fredette */ 259 1.1 fredette int **un3x_shadowpteaddr; 260 1.1 fredette /* Ptr to memory list for 3/80 */ 261 1.1 fredette struct physmemory *un3x_physmemory; 262 1.1 fredette } un3x; 263 1.1 fredette } mon_un; 264 1.1 fredette } __attribute__((packed)); 265 1.1 fredette 266 1.1 fredette /* 267 1.1 fredette * Functions defined in the vector: 268 1.1 fredette * 269 1.1 fredette * 270 1.1 fredette * getChar -- Return the next character from the input source 271 1.1 fredette * 272 1.1 fredette * u_char getChar() 273 1.1 fredette * 274 1.1 fredette * putChar -- Write the given character to the output source. 275 1.1 fredette * 276 1.1 fredette * void putChar(ch) 277 1.1 fredette * char ch; 278 1.1 fredette * 279 1.1 fredette * mayGet -- Maybe get a character from the current input source. Return -1 280 1.1 fredette * if don't return a character. 281 1.1 fredette * 282 1.1 fredette * int mayGet() 283 1.1 fredette * 284 1.1 fredette * mayPut -- Maybe put a character to the current output source. Return -1 285 1.1 fredette * if no character output. 286 1.1 fredette * 287 1.1 fredette * int mayPut(ch) 288 1.1 fredette * char ch; 289 1.1 fredette * 290 1.1 fredette * getKey -- Returns a key code (if up/down codes being returned), 291 1.1 fredette * a byte of ASCII (if that's requested), 292 1.1 fredette * NOKEY (if no key has been hit). 293 1.1 fredette * 294 1.1 fredette * int getKey() 295 1.1 fredette * 296 1.1 fredette * initGetKey -- Initialize things for get key. 297 1.1 fredette * 298 1.1 fredette * void initGetKey() 299 1.1 fredette * 300 1.1 fredette * fbWriteChar -- Write a character to the frame buffer 301 1.1 fredette * 302 1.1 fredette * void fwritechar(ch) 303 1.1 fredette * u_char ch; 304 1.1 fredette * 305 1.1 fredette * fbWriteStr -- Write a string to the frame buffer. 306 1.1 fredette * 307 1.1 fredette * void fwritestr(addr,len) 308 1.2 chs * u_char *addr; / * String to be written * / 309 1.2 chs * short len; / * Length of string * / 310 1.1 fredette * 311 1.1 fredette * getLine -- read the next input line into a global buffer 312 1.1 fredette * 313 1.1 fredette * getline(echop) 314 1.1 fredette * int echop; / * 1 if should echo input, 0 if not * / 315 1.1 fredette * 316 1.1 fredette * getNextChar -- return the next character from the global line buffer. 317 1.1 fredette * 318 1.1 fredette * u_char getNextChar() 319 1.1 fredette * 320 1.1 fredette * peekNextChar -- look at the next character in the global line buffer. 321 1.1 fredette * 322 1.1 fredette * u_char peekNextChar() 323 1.1 fredette * 324 1.1 fredette * getNum -- Grab hex num from the global line buffer. 325 1.1 fredette * 326 1.1 fredette * int getNum() 327 1.1 fredette * 328 1.1 fredette * printf -- Scaled down version of C library printf. Only %d, %x, %s, and %c 329 1.1 fredette * are recognized. 330 1.1 fredette * 331 1.1 fredette * printhex -- prints rightmost <digs> hex digits of <val> 332 1.1 fredette * 333 1.2 chs * printhex(val, digs) 334 1.2 chs * int val; 335 1.2 chs * int digs; 336 1.1 fredette * 337 1.1 fredette * abortEntry -- Entry for keyboard abort. 338 1.1 fredette * 339 1.1 fredette * abortEntry() 340 1.1 fredette */ 341 1.1 fredette 342 1.1 fredette /* 343 1.1 fredette * Functions and defines to access the monitor. 344 1.1 fredette */ 345 1.1 fredette 346 1.1 fredette #define mon_printf (romVectorPtr->printf) 347 1.1 fredette #define mon_putchar (romVectorPtr->putChar) 348 1.1 fredette #define mon_may_getchar (romVectorPtr->mayGet) 349 1.1 fredette #define mon_exit_to_mon (romVectorPtr->exitToMon) 350 1.1 fredette #define mon_reboot (romVectorPtr->reBoot) 351 1.1 fredette 352 1.1 fredette /* 353 1.1 fredette * Sun2 specific stuff... 354 1.1 fredette */ 355 1.1 fredette 356 1.1 fredette /* 357 1.1 fredette * MONSTART and MONEND denote the range used by the monitor. 358 1.1 fredette * PROM_BASE is the virtual address of the PROM. 359 1.1 fredette */ 360 1.1 fredette #define SUN2_MONSTART 0x00E00000 361 1.1 fredette #define SUN2_PROM_BASE 0x00EF0000 362 1.1 fredette #define SUN2_MONEND 0x00F00000 363 1.1 fredette 364 1.1 fredette /* 365 1.1 fredette * Sun3 specific stuff... 366 1.1 fredette */ 367 1.1 fredette 368 1.1 fredette #ifdef _SUN3_ 369 1.1 fredette #define setcxsegmap mon_un.un3.un3_setcxsegmap 370 1.1 fredette #define vector_cmd mon_un.un3.un3_vector_cmd 371 1.1 fredette #define romVectorPtr ((struct sunromvec *) SUN3_PROM_BASE) 372 1.1 fredette #endif /* SUN3 */ 373 1.1 fredette 374 1.1 fredette /* 375 1.1 fredette * MONSTART and MONEND denote the range used by the monitor. 376 1.1 fredette * PROM_BASE is the virtual address of the PROM. 377 1.1 fredette */ 378 1.1 fredette #define SUN3_MONSTART 0x0FE00000 379 1.1 fredette #define SUN3_PROM_BASE 0x0FEF0000 380 1.1 fredette #define SUN3_MONEND 0x0FF00000 381 1.1 fredette 382 1.1 fredette /* 383 1.1 fredette * These describe the monitor's short segment (one it can reach using 384 1.1 fredette * short PC-relative addressing) which it uses to map its data page. 385 1.1 fredette * MONSHORTPAGE is the page; MONSHORTSEG is the containing segment. 386 1.1 fredette * Its mapping must not be removed or the PROM monitor will fail. 387 1.1 fredette * MONSHORTPAGE is also where the "ie" puts its SCP. 388 1.1 fredette */ 389 1.1 fredette #define SUN3_MONSHORTPAGE 0x0FFFE000 390 1.1 fredette #define SUN3_MONSHORTSEG 0x0FFE0000 391 1.1 fredette 392 1.1 fredette /* 393 1.1 fredette * Sun3X specific stuff... 394 1.1 fredette */ 395 1.1 fredette 396 1.1 fredette #ifdef _SUN3X_ 397 1.1 fredette #define vector_cmd mon_un.un3x.un3x_vector_cmd 398 1.1 fredette #define lomemptaddr mon_un.un3x.un3x_lomemptaddr 399 1.1 fredette #define monptaddr mon_un.un3x.un3x_monptaddr 400 1.1 fredette #define dvmaptaddr mon_un.un3x.un3x_dvmaptaddr 401 1.1 fredette #define monptphysaddr mon_un.un3x.un3x_monptphysaddr 402 1.1 fredette #define shadowpteaddr mon_un.un3x.un3x_shadowpteaddr 403 1.1 fredette #define v_physmemory mon_un.un3x.un3x_physmemory 404 1.1 fredette #define romVectorPtr ((struct sunromvec *) SUN3X_PROM_BASE) 405 1.1 fredette #endif /* SUN3X */ 406 1.1 fredette 407 1.1 fredette /* 408 1.1 fredette * We don't have a separate kernel debugger like sun kadb, 409 1.1 fredette * but this range is setup by the monitor for such a thing. 410 1.1 fredette * We might as well preserve the mappings anyway. 411 1.1 fredette */ 412 1.1 fredette #define SUN3X_MON_KDB_BASE 0xFEE00000 413 1.1 fredette #define SUN3X_MON_KDB_SIZE 0x100000 414 1.1 fredette 415 1.1 fredette /* 416 1.1 fredette * MONSTART and MONEND define the range used by the monitor. 417 1.1 fredette * MONDATA is its data page (do not touch!) 418 1.1 fredette * PROM_BASE is where the boot PROM lives. 419 1.1 fredette */ 420 1.1 fredette #define SUN3X_MONSTART 0xFEF00000 421 1.1 fredette #define SUN3X_MONDATA 0xFEF72000 422 1.1 fredette #define SUN3X_PROM_BASE 0xFEFE0000 423 1.1 fredette #define SUN3X_MONEND 0xFF000000 424 1.1 fredette 425 1.1 fredette /* 426 1.1 fredette * These define the CPU virtual address range mapped by the 427 1.1 fredette * PROM for use as DVMA space. The physical pages mapped in 428 1.1 fredette * this range are also mapped by the I/O MMU. Note that the 429 1.1 fredette * last page is reserved for the PROM (really for the "ie"). 430 1.1 fredette */ 431 1.1 fredette #define SUN3X_MON_DVMA_BASE 0xFFF00000 432 1.1 fredette #define SUN3X_MON_DVMA_SIZE 0x100000 /* 1MB */ 433 1.1 fredette 434 1.1 fredette #ifdef _STANDALONE 435 1.1 fredette /* The libsa code uses a pointer... */ 436 1.1 fredette extern struct sunromvec *_romvec; 437 1.1 fredette #undef romVectorPtr 438 1.1 fredette #define romVectorPtr _romvec 439 1.1 fredette #endif /* _STANDALONE */ 440 1.1 fredette 441 1.1 fredette #endif /* _MACHINE_MON_H */ 442