/* @(#) uraid.c Version 1.52 (4/23/92). copyright Venue & Fuji Xerox */ static char *id = "@(#) uraid.c 1.52 4/23/92 (Venue & Fuji Xerox)"; /************************************************************************/ /* */ /* (C) Copyright 1989-1995 Venue. All Rights Reserved. */ /* Manufactured in the United States of America. */ /* */ /* The contents of this file are proprietary information */ /* belonging to Venue, and are provided to you under license. */ /* They may not be further distributed or disclosed to third */ /* parties without the specific permission of Venue. */ /* */ /************************************************************************/ #include "version.h" /************************************************************************/ /************************************************************************/ /* */ /* U R A I D . C */ /* */ /* URAID is the low-level debugger for Medley. */ /* */ /************************************************************************/ /************************************************************************/ #include #include #include #ifdef ISC #include #define vfork fork #endif /* ISC */ #ifdef INDIGO #define vfork fork #endif /* INDIGO */ #include #ifndef DOS #include #include #include #include #endif /* DOS */ #include #ifndef XWINDOW #ifdef SUNDISPLAY #include #include #endif /* SUNDISPLAY */ #include #ifndef NOPIXRECT #include #include #include #include #include #include #ifdef SUNDISPLAY extern int Win_security_p; #endif /* SUNDISPLAY */ #endif /* NOPIXRECT */ #endif /* XWINDOW */ #ifdef OS5 #include #endif /* OS5 */ #if defined(FREEBSD) || defined(MACOSX) /* for memset */ #include #endif #include "lispemul.h" #include "lispmap.h" #include "adr68k.h" #include "lsptypes.h" #include "lspglob.h" #include "emlglob.h" #include "cell.h" #include "stack.h" #include "llstk.h" #include "ifpage.h" #include "debug.h" #include "devconf.h" #include "display.h" #include "bitblt.h" #include "uraid.h" #ifdef DOS #define vfork() printf("No forking around here.\n") #endif /* DOS */ #if defined(DOS) || defined(XWINDOW) #include "devif.h" extern DspInterface currentdsp; #endif /* DOS || XWINDOW */ #ifdef DOS extern MouseInterface currentmouse; extern KbdInterface currentkbd; #endif /* DOS */ #ifdef COLOR extern int MonoOrColor; extern int Dispcolorsize; extern DLword *ColorDisplayRegion68k; #endif /* COLOR */ /***********************************************************************/ /* File name : uraid.c Written by : Takeshi Shimizu(Take) Date: 6-May-1988 This File Supports the following commands: **URAID command summary** <> c Checks all user stack contents f number Displays frame extension for the number(decimal) k type Changes the type of stack link following.(a|c) l [type] Back trace for specified type stack.(k|m|r|g|p|u) Display next frame. <> a litatom Displays the top-level value of the litatom d litatom Displays the definition cell for the litatom M Displays TOS,CSP,PVAR,IVAR,PC m func1 func2 MOVED func1 to func2 t Xaddress Displays the type of this object p litatom Displays the property list of the litatom w Displays the current function-name and PC x Xaddress [xnum] Hex-Dump xnum word(16-bits) starting at Xaddress @ litatom val Sets TOPVAL of litatom to Decimal-val < Xaddress val Sets the word(16-bits) at the address to val <> e Exit to UNIX / DOS h Context switch to HARDRESET q Returns from URAID with NO-change <> s Invoke Shell v filename Save the virtual memory on the filename(Not Bootable) ( [num] Sets Print level ! Prints the error message passed from the emulator ? Display this summary */ /************************************************************************/ #ifndef NOPIXRECT extern int black, white; extern struct pixrect *ColorDisplayPixrect, *DisplayRegionPixrect; #endif /* NOPIXRECT */ extern int DisplayRasterWidth; extern unsigned int LispReadFds, LispWindowFd, LispKbdFd; #ifndef NOPIXRECT extern struct pixrect *CursorBitMap, *InvisibleCursorBitMap; #endif /* NOPIXRECT */ extern struct cursor CurrentCursor, InvisibleCursor; extern struct screen LispScreen; extern int displaywidth, displayheight; extern DLword *DisplayRegion68k; extern int FrameBufferFd, ether_fd, RS232C_Fd; extern u_int EtherReadFds; LispPTR RadiAtomIndex; LispPTR RaidPackageIndex; char *HideDisp68k; #ifdef COLOR char *HideColorDisp68k; extern int Inited_Color; #endif /* COLOR */ #ifdef DOS char *URaid_summary1 = "<>\n\ c\t\t\tChecks all user stack contents\n\ f number\t\tDisplays stack frame for that frame number (decimal)\n\ k type\t\t\tChanges the type of stack link following. (a|c)\n\ l [type]\t\tBack Trace for specified type stack. (k|m|r|g|p|u|)\n\ \t\t\tDisplay next frame.\n"; char *URaid_summary2 = "<>\n\ a litatom\t\tDisplays the top-level value of the litatom\n\ B Xaddress\t\tPrint the contents of the arrayblock at that address.\n\ d litatom\t\tDisplays the definition cell for the litatom\n\ M\t\t\tDisplays TOS,CSP,PVAR,IVAR,PC\n\ m func1 func2\t\tMOVD func1 to func2\n\ O Xaddress\t\tDisplays the object with that address\n\ t Xaddress\t\tDisplays the type of this object\n\ p litatom\t\tDisplays the property list of the litatom\n\ w\t\t\tDisplays the current function-name and PC\n\ x Xaddress [xnum]\tHex-Dump xnum (16-bit) words starting at Xaddress\n\ @ litatom val\t\tSets TOPVAL of litatom to Decimal-val\n\ < Xaddress Xval\t\tSets the (16-bit) word at the address to Xval\n"; char *URaid_summary3 = "<>\n\ e\t\t\tExit to DOS\n\ h\t\t\tDo a HARDRESET\n\ q\t\t\tReturns from URAID with NO change\n\ <>\ns\t\t\tInvoke Shell\n\ v filename\t\tSave the virtual memory on the filename(Not Bootable)\n\ ( [num]\t\t\tSets Print level\n\ !\t\t\tPrints the error message passed from the emulator\n\ ?\t\t\tDisplay this summary"; #else char *URaid_summary = "---URAID command summary---\n\ <>\n\ c\t\t\tChecks all user stack contents\n\ f number\t\tDisplays stack frame for that frame number (decimal)\n\ k type\t\t\tChanges the type of stack link following. (a|c)\n\ l [type]\t\tBack Trace for specified type stack. (k|m|r|g|p|u|)\n\ \t\t\tDisplay next frame.\n<>\n\ a litatom\t\tDisplays the top-level value of the litatom\n\ B Xaddress\t\tPrint the contents of the arrayblock at that address.\n\ d litatom\t\tDisplays the definition cell for the litatom\n\ M\t\t\tDisplays TOS,CSP,PVAR,IVAR,PC\n\ m func1 func2\t\tMOVD func1 to func2\n\ O Xaddress\t\tDisplays the object with that address\n\ t Xaddress\t\tDisplays the type of this object\n\ p litatom\t\tDisplays the property list of the litatom\n\ w\t\t\tDisplays the current function-name and PC\n\ x Xaddress [xnum]\tHex-Dump xnum (16-bit) words starting at Xaddress\n\ @ litatom val\t\tSets TOPVAL of litatom to Decimal-val\n\ < Xaddress Xval\t\tSets the (16-bit) word at the address to Xval\n\ <>\n\ e\t\t\tExit to UNIX\n\ h\t\t\tDo a HARDRESET\n\ q\t\t\tReturns from URAID with NO change\n\ <>\ns\t\t\tInvoke Shell\n\ v filename\t\tSave the virtual memory on the filename(Not Bootable)\n\ ( [num]\t\t\tSets Print level\n\ !\t\t\tPrints the error message passed from the emulator\n\ ?\t\t\tDisplay this summary"; #endif /* DOS */ #define ADD_RANGEP(address) \ if ((address < 0) || (POINTERMASK < address)) { \ printf("Address out of range.\n"); \ return (T); \ } extern int get_package_atom(); #define URMAXCOMM 512 #define URMAXFXNUM 2000 #define URSCAN_ALINK 0 #define URSCAN_CLINK 1 /*** URaid G vals ***/ int URaid_scanlink = URSCAN_ALINK; int URaid_currentFX = URMAXFXNUM + 1; FX *URaid_FXarray[URMAXFXNUM]; int URaid_ArrMAXIndex; char URaid_inputstring[URMAXCOMM]; char URaid_comm; char URaid_arg1[URMAXCOMM / 2]; char URaid_arg2[URMAXCOMM / 2]; int URaid_argnum; char *URaid_errmess; extern int PrintMaxLevel; /* for print level */ /***********************************************************************/ /* func name : parse_atomstring(string) Written by : Takeshi Shimizu Date: 6-May-1988 Pass the atomstring(e.g. "XCL:EVAL") Then Returns atomindex . If fail to find, return -1 If there is no package prefix,it will be treated as IL: */ /***********************************************************************/ LispPTR make_atom(); LispPTR parse_atomstring(char *string) { char *start, *packageptr, *nameptr; int flag = 0; int packagelen = 0; int namelen = 0; int cnt; LispPTR aindex; for (cnt = 0, start = string; *string != '\0'; string++, cnt++) { if (*string == ':') { packagelen = cnt; packageptr = start; nameptr = string + 1; cnt = 0; *string = 0; } } if (packagelen == 0) { /* treat as IL: */ nameptr = start; namelen = cnt; } else namelen = cnt - 1; if ((packagelen == 0) || (strncmp(packageptr, "IL", packagelen) == 0)) { /* default IL: */ aindex = make_atom(nameptr, 0, namelen, T); if (aindex == 0xffffffff) { printf("trying IL:\n"); aindex = get_package_atom(nameptr, namelen, "INTERLISP", 9, 0); } } else aindex = get_package_atom(nameptr, namelen, packageptr, packagelen, 0); if (aindex == 0xffffffff) return (0xffffffff); printf("INDEX : %d\n", aindex & 0xffff); return (aindex & 0xffff); } /***********************************************************************/ /* func name : uraid_commclear() Written by : Takeshi Shimizu Date: 6-May-1988 Clear Command buffer */ /***********************************************************************/ void uraid_commclear() { memset(URaid_inputstring, 0, URMAXCOMM); memset(URaid_arg1, 0, URMAXCOMM / 2); memset(URaid_arg2, 0, URMAXCOMM / 2); URaid_comm = 0; URaid_argnum = 0; } void copy_region(short *src, short *dst, int width, int h) { register int w; for (; (h--);) { for (w = width; (w--);) { GETWORD(dst++) = GETWORD(src++); } } } /***********************************************************************/ /* func name : uraid_commands() Written by : Takeshi Shimizu Date: 6-May-1988 Execute URaid commands To continue, return T To exit, return NIL */ /***********************************************************************/ LispPTR uraid_commands() { int num, address, val, tmp; LispPTR index; DefCell *defcell68k; #ifndef DOS #if defined(SYSVONLY) || defined(WAITINT) int status; #else union wait status; #endif /* SYSVONLY */ #endif /* DOS */ if (URaid_argnum == -1) { /* disp next FX */ if (URaid_currentFX > URaid_ArrMAXIndex) { printf("There is no more stack.\n"); return (T); } else { sf(URaid_FXarray[URaid_currentFX++]); return (T); } } switch (URaid_comm) { /*** Displaying STACK stuff */ #ifdef DOS case '1': printf("%s\n", URaid_summary1); break; case '2': printf("%s\n", URaid_summary2); break; case '3': printf("%s\n", URaid_summary3); break; #endif /* DOS */ case 'c': stack_check(0); break; case 'C': all_stack_dump(0, 0, T); break; case 'f': /**if((URaid_arg1[0] < '0') || (URaid_arg1[0] > '9')){ printf("Illegal argument, not a number\n"); return(T); }**/ if (URaid_argnum == 1) /* f comm only */ { printf("DUMP-STACK: f decimal-FXnumber\n"); return (T); } if (sscanf(URaid_arg1, "%d", &num) <= 0) { /* com read fails */ printf("Illegal argument, not decimal number\n"); return (T); } if ((num > URaid_ArrMAXIndex) || (num < 0)) { printf("Frame number doesn't exist.\n"); return (T); } sf(URaid_FXarray[num]); URaid_currentFX = num + 1; break; case 'k': if ((URaid_arg1[0] == 'A') || (URaid_arg1[0] == 'a')) URaid_scanlink = URSCAN_ALINK; else if ((URaid_arg1[0] == 'C') || (URaid_arg1[0] == 'c')) URaid_scanlink = URSCAN_CLINK; else printf("Link type should be A or C\n"); break; case 'l': if (URaid_argnum == 1) { bt(); /* default case CURRENTFX */ return (T); } switch (URaid_arg1[0]) { case 'k': printf("IFP->KBDFXP :\n"); bt1(Addr68k_from_StkOffset(InterfacePage->kbdfxp)); break; case 'm': printf("IFP->MISCFXP :\n"); bt1(Addr68k_from_StkOffset(InterfacePage->miscfxp)); break; case 'r': printf("IFP->RESETFXP :\n"); bt1(Addr68k_from_StkOffset(InterfacePage->resetfxp)); break; case 'g': printf("IFP->GCFXP :\n"); bt1(Addr68k_from_StkOffset(InterfacePage->gcfxp)); break; case 'p': printf("IFP->FAULTFXP :\n"); bt1(Addr68k_from_StkOffset(InterfacePage->faultfxp)); break; case 'u': bt(); break; default: printf("2nd argument should be k,m,r,g,p,u or null.\n"); break; } /* switch end */ break; /* Displaying the memory contents stuff */ case 'a': /* GETTOPVAL */ if (URaid_argnum != 2) { printf("GETTOPVAL: a litatom\n"); return (T); } if ((index = parse_atomstring(URaid_arg1)) == 0xffffffff) { printf("No such atom.\n"); return (T); } else { printf("Atom: %s index %d\n", URaid_arg1, index); } print(*((LispPTR *)GetVALCELL68k(index))); break; case 'd': /* DEFCELL */ if (URaid_argnum != 2) { printf("GETD: d litatom\n"); return (T); } if ((index = parse_atomstring(URaid_arg1)) == 0xffffffff) { printf("No such atom.\n"); return (T); } else { printf("Atom: %s index %d\n", URaid_arg1, index); } defcell68k = (DefCell *)GetDEFCELL68k(index); if (defcell68k->ccodep) { printf("{CCODEP}0x%x\n", defcell68k->defpointer); return (T); } else { print(defcell68k->defpointer); return (T); } break; case 'M': /* Machine States */ printf("TOS : 0x%x\n", TopOfStack); printf("CSTKP : 0x%x\n", LADDR_from_68k(CurrentStackPTR)); printf("PVAR : 0x%x\n", LADDR_from_68k(PVar)); printf("IVAR : 0x%x\n", LADDR_from_68k(IVar)); printPC(); putchar('\n'); break; case 'm': /* MOVD */ if (URaid_argnum != 3) { printf("MOVD: m \n"); return (T); } { DefCell *fromfunc, *tofunc; LispPTR fromindex, toindex; if ((fromindex = parse_atomstring(URaid_arg1)) == 0xffffffff) { printf("No such function (from)\n"); return (T); } if ((toindex = parse_atomstring(URaid_arg2)) == 0xffffffff) { printf("No such function (to)\n"); return (T); } fromfunc = (DefCell *)GetDEFCELL68k(fromindex); tofunc = (DefCell *)GetDEFCELL68k(toindex); tofunc->defpointer = fromfunc->defpointer; print(toindex); printf(" is smashed with "); print(fromindex); putchar('\n'); } break; case 'O': { /* print instance from Laddr. Not documented */ int objaddr; if (URaid_argnum == 1) { printf("PRINT-INSTANCE: O HEX-LispAddress\n"); return (T); } if (sscanf(URaid_arg1, "%x", &objaddr) <= 0) { printf("Arg not HEX number\n"); return (T); } print(objaddr); } break; case 't': /* Object TYPE */ if (URaid_argnum != 2) { printf("PRINTTYPENAME: t Xaddress\n"); return (T); } /**HEXNUMP(URaid_arg1,"Not Address");**/ if (sscanf(URaid_arg1, "%x", &address) <= 0) { printf("Arg not HEX number\n"); return (T); } ADD_RANGEP(address); switch (address >> 16) { case ATOM_HI: printf("{ATOM}"); printf("0x%x\n", address); break; case STK_HI: printf("{STK}"); printf("0x%x\n", address); break; case PLIS_HI: printf("{PLIST}"); printf("0x%x\n", address); break; case FPTOVP_HI: printf("{FPTOVP}"); printf("0x%x\n", address); break; case PNP_HI: printf("{PNP}"); printf("0x%x\n", address); break; case DEFS_HI: printf("{DEF}"); printf("0x%x\n", address); break; case VALS_HI: printf("{VAL}"); printf("0x%x\n", address); break; case DISPLAY_HI: case DISPLAY_HI + 1: printf("{DISPLAY}"); printf("0x%x\n", address); break; default: num = GetTypeNumber(address); putchar('{'); print_atomname((DLword *)GetDTD(num)); putchar('}'); break; } /* switch end */ break; #define GetPROPCELL68k(index) ((LispPTR *)Plistspace + (index)) case 'p': /* property list */ if (URaid_argnum != 2) { printf("GETPROPLIST : p litatom\n"); return (T); } if ((index = parse_atomstring(URaid_arg1)) == 0xffffffff) { printf("No such atom\n"); return (T); } print(*(GetPROPCELL68k(index)) & POINTERMASK); break; case 'w': /* Disp CurrentFunc name & PC */ doko(); break; #define XDUMPW 8 case 'x': /* HEX dump "x Xaddress Xnum" */ /* Obsolete HEXNUMP(URaid_arg1,"Not Address"); HEXNUMP(URaid_arg2,"Not number"); ***/ if (URaid_argnum == 1) { /* for help */ printf("HEX-DUMP: x Xaddress [Xnum]\n"); return (T); } if (sscanf(URaid_arg1, "%x", &address) <= 0) { /* arg1 not HEX */ printf("Arg(Xaddress) not Xaddress\n"); return (T); } switch (sscanf(URaid_arg2, "%x", &num)) { case -1: /* Use defaultval for word-num */ num = XDUMPW; break; case 0: /* Illegal number */ printf("Arg(Xnum) not Xnum\n"); return (T); /* break; */ default: break; } if (num < 0) { printf("Dump words num should be positive\n"); return (T); } /* Address range check */ ADD_RANGEP(address); ADD_RANGEP(address + num); { int i; DLword *ptr, *endptr; ptr = (DLword *)Addr68k_from_LADDR(address); endptr = ptr + num; while (ptr < endptr) { printf("0x%x : ", LADDR_from_68k(ptr)); for (i = 0; ((ptr < endptr) && (i < XDUMPW)); ptr++, i++) { printf("%4x ", *ptr); } putchar('\n'); } } break; case '@': /* SETTOPVAL */ if (URaid_argnum != 3) { printf("SETTOPVAL: @ litatom Decimal-val\n"); return (T); } if ((index = parse_atomstring(URaid_arg1)) == 0xffffffff) { printf("No such atom\n"); return (T); } if (strncmp(URaid_arg2, "NIL", 3) == 0) { val = NIL; } else if (*URaid_arg2 == 'T') val = ATOM_T; else { if (sscanf(URaid_arg2, "%d", &val) == -1) { printf(" Bad value\n"); return (T); } else { if ((val < -65536) || (65535 < val)) { printf("Bad Val range\n"); return (T); } if (val >= 0) val |= S_POSITIVE; else { val = val & 0xffff; val |= S_NEGATIVE; } } } printf("Old value is "); print(*((LispPTR *)GetVALCELL68k(index))); putchar('\n'); *((LispPTR *)GetVALCELL68k(index)) = (LispPTR)val; print(val); break; case '<': if (URaid_argnum != 3) { printf("Mem modify: < Xaddre Xval\n"); return (T); } /* Assignment */ /* OBSOLETE HEXNUMP(URaid_arg1,"Not Address"); HEXNUMP(URaid_arg2,"Not Proper Value"); ***/ if (sscanf(URaid_arg1, "%x", &address) <= 0) { printf("Arg(Xaddress) not Xaddress\n"); return (T); } if (sscanf(URaid_arg2, "%x", &val) <= 0) { printf("Arg(Xval) not Xaddress\n"); return (T); } ADD_RANGEP(address); if (val < 0 || val > 0xffff) { printf("Xval invalid (16 bit range exceeded).\n"); return (T); } { DLword *ptr; ptr = (DLword *)Addr68k_from_LADDR(address); *ptr = val; printf("0x%x : 0x%x\n", address, *ptr); } break; /****MISC ****/ case 'q': /* return with do Nothing */ printf("Return to Lisp?[confirm](Y or N)<"); { int c; c = getchar(); if ((c == 'Y') || (c == 'y')) { /*TopOfStack = NIL;*/ return (NIL); } } fflush(stdin); URaid_currentFX = URMAXFXNUM + 1; return (T); /* break; */ case 'h': /* HARDRESET */ printf("HARDRESET?[confirm](Y or N)<"); { int c; c = getchar(); if ((c == 'Y') || (c == 'y')) { /*PC+= 3; for currentfx->pc ajust:MOve to subr */ contextsw(ResetFXP, 2, 0); /*PC -= 3; in subr.c it increments by 3 */ fflush(stdin); return (NIL); /* return to dispatch */ } } fflush(stdin); break; case 'e': /* exit to UNIX */ #ifdef DOS printf("Exit to DOS?[confirm](Y or N)<"); #else /* DOS */ printf("Exit to UNIX?[confirm](Y or N)<"); #endif /* DOS */ { int c; c = getchar(); if ((c == 'Y') || (c == 'y')) exit(0); } fflush(stdin); URaid_currentFX = URMAXFXNUM + 1; break; case 's': /* SHELL */ switch (vfork()) { case -1: (void)fprintf(stderr, "uraid: Fork failed.\n"); exit(1); case 0: (void)execl("/bin/sh", "sh", "-i", 0); exit(1); default: break; } #ifndef DOS (void)wait(&status); /* system("/bin/sh -i"); */ #endif /* DOS */ return (T); /* break; */ case 'v': if (URaid_argnum != 2) { printf("VMEMSAVE: v filename (it's NOT bootable)\n"); return (T); } #ifndef DISPLAYBUFFER copy_region(HideDisp68k, DisplayRegion68k, DisplayRasterWidth, displayheight); #endif /* DISPLAYBUFFER */ if (vmem_save(URaid_arg1) != NIL) { #ifndef DISPLAYBUFFER clear_display(); #endif /* DISPLAYBUFFER */ printf("VMEMSAVE fails\n"); } else { clear_display(); printf("VMEMSAVE finished, but it's not bootable\n"); } break; case '(': if (URaid_argnum == 1) num = 2; else if ((URaid_arg1[0] < '0') || (URaid_arg1[0] > '9')) { printf("Illegal argument, not number\n"); return (T); } else sscanf(URaid_arg1, "%d", &num); PrintMaxLevel = num; printf("PrintLevel is set to %d.", num); break; case '?': #ifdef DOS printf( " 1: <>\n 2: <>\n 3: <>\n"); #else printf("%s\n", URaid_summary); #endif /* DOS */ break; case '!': printf("Error message is: %s\n", URaid_errmess); break; default: printf("Unsupported command.\n"); break; } /* switch end */ return (T); } /************************************************************************/ /* */ /* device_before_raid() */ /* */ /* Written by : Takeshi Shimizu */ /* Date: 6-May-1988 */ /* */ /* */ /* Do whatever cleanup is necessary before leaving Lisp */ /* for URAID or for SUSPEND-LISP: Cache the display buffer, */ /* close the frame buffer, and any buffering pixrects. */ /* */ /************************************************************************/ #ifdef DISPLAYBUFFER extern struct pixrect *ColorDisplayPixrect, *DisplayRegionPixrect; #endif #ifdef SUNDISPLAY #define SV_ACQUIRE "/bin/sunview1/sv_acquire" #define SV_RELEASE "/bin/sunview1/sv_release" #endif /* SUNDISPLAY */ int device_before_raid() { int keytrans; int size; int munmapstat; struct pixrect *fb; /* extern char *alloc_hideDISP(); */ #ifdef SUNDISPLAY union wait status; #endif /* SUNDISPLAY */ int_timer_off(); #if (defined(XWINDOW) && defined(SYSVSIGNALS) && defined(SIGIO)) sigrelse(SIGIO); /* So X events still get recognized. */ #endif /* XWINDOW + SYSVSIGNALS + SIGIO */ #ifdef SUNDISPLAY win_setcursor(LispWindowFd, &InvisibleCursor); #ifdef KBINT int_io_close(LispWindowFd); #endif #endif /* SUNDISPLAY */ #ifdef NOETHER #else #ifdef ETHERINT if (ether_fd > 0) /* check ether is used or not */ int_io_close(ether_fd); #endif #endif /* NOETHER */ #ifdef RS232INT int_io_close(RS232C_Fd); #endif #ifdef SUNDISPLAY mess_reset(); /* turn off console-msg handling */ #ifdef FX_AR_124 /* For AR 124. Type4 driver bug?? by m.matsuda */ { long i; for (i = 0; i < 900000; i++) ; } #endif /* FX_AR_124 */ if ((LispKbdFd = open(LispScreen.scr_kbdname, O_RDWR)) == -1) { fprintf(stderr, "can't open %s\n", LispScreen.scr_kbdname); return (-1); } keytrans = TR_EVENT; /* keyboard encodes key */ if (ioctl(LispKbdFd, KIOCTRANS, &keytrans) == -1) { fprintf(stderr, "Error at ioctl errno =%d\n", errno); return (-1); } close(LispKbdFd); close(LispWindowFd); #ifdef TRUECOLOR truecolor_before_raid(); #endif /* TRUECOLOR */ #ifndef DISPLAYBUFFER size = ((displaywidth * displayheight / 8 + (getpagesize() - 1)) & -getpagesize()); if ((HideDisp68k = malloc(size)) == 0) { printf("can't malloc hide space\n"); return (-1); } copy_region(DisplayRegion68k, HideDisp68k, DisplayRasterWidth, displayheight); #endif /* DISPLAYBUFFER */ #ifdef COLOR save_colormap(); #ifndef DISPLAYBUFFER if (Inited_Color) { #else if (MonoOrColor == COLOR_SCREEN) { #endif /* DISPLAYBUFFER */ /* save color image */ size = ((displaywidth * displayheight + (getpagesize() - 1)) & -getpagesize()); /* 8 bit depth */ if ((HideColorDisp68k = malloc(size)) == 0) { printf("can't malloc hide space\n"); return (-1); } copy_region(ColorDisplayRegion68k, HideColorDisp68k, DisplayRasterWidth * 8, displayheight); } /* end if(MonoOrColor) */ #endif /* COLOR */ clear_display(); #ifdef DISPLAYBUFFER pr_close(ColorDisplayPixrect); close(FrameBufferFd); #endif if (Win_security_p) { switch (vfork()) { case -1: /* Error */ (void)fprintf(stderr, "display_before_exit: Fork failed.\n"); exit(1); case 0: /* Child */ (void)execl(SV_RELEASE, "sv_release", 0); /* should not return */ (void)fprintf(stderr, "display_before_exit: exec for sv_release failed\n"); exit(1); default: /* Parent */ /* do nothing */ break; } (void)wait(&status); /* child dies after changing 16 */ if (status.w_retcode != 0) { (void)fprintf(stderr, "device_before_raid: failed to set ownership of win devices\n"); exit(1); } } #endif /* SUNDISPLAY */ #if defined(XWINDOW) || defined(DOS) (currentdsp->cleardisplay)(currentdsp); (currentdsp->device.before_raid)(currentdsp); #ifdef DOS (currentmouse->device.before_raid)(currentmouse); (currentkbd->device.before_raid)(currentkbd); #endif /* DOS */ #endif /* XWINDOW || DOS */ return (0); } /** char *alloc_hideDISP(int size) { char *retaddr; switch(*STORAGEFULLSTATE_word & 0xffff) { case SFS_NOTSWITCHABLE : if((retaddr =malloc(size)) ==0){ fprintf(stderr,"can't alloc hide space\n"); } break; case 0 : case SFS_SWITCHABLE : retaddr = (char*)Addr68k_from_LADDR((*ArraySpace2_word) & POINTERMASK); printf("Hidespace inside Lisp(2)\n"); break; case SFS_ARRAYSWITCHED : retaddr=(char*)Addr68k_from_LADDR(*Next_Array_word & 0xffff); ; printf("Hidespace inside Lisp(3)\n"); break; case SFS_FULLYSWITCHED : if((UNSIGNED)Addr68k_from_LADDR(*Next_MDSpage_word & 0xffff) - (UNSIGNED)Addr68k_from_LADDR(*Next_Array_word & 0xffff) >size) { retaddr= (char*)Addr68k_from_LADDR(*Next_Array_word & 0xffff); printf("Hidespace inside Lisp(4)\n"); } else if((retaddr=malloc(size)) ==0){ fprintf(stderr,"can't alloc hide disp\n"); } printf("Hidespace new\n"); break; default : printf("Illegal data in STORAGEFULLSTATE\n"); retaddr=0; break; } return(retaddr); } ****/ /***********************************************************************/ /* func name : device_after_raid() Written by : Takeshi Shimizu Date: 6-May-1988 This should be called when returning LISP. */ /***********************************************************************/ /* * Seems like a bad return type or bad code, returning 0, -1, or NIL * NBriggs May 2017 */ #define KB_ALLUP 0xffff static int re_init_display(int, int); int device_after_raid() { extern DLword *EmMouseX68K, *EmMouseY68K, *EmKbdAd068K, *EmRealUtilin68K; extern DLword *EmKbdAd168K, *EmKbdAd268K, *EmKbdAd368K, *EmKbdAd468K, *EmKbdAd568K; LispReadFds = 0; if (re_init_display(DISPLAY_OFFSET, 65536 * 16 * 2) == -1) return (-1); set_cursor(); init_keyboard(1); #ifdef TRUECOLOR truecolor_after_raid(); #endif /* TRUECOLOR */ #ifdef NOETHER #else init_ether(); #ifdef USE_DLPI if (ether_fd > 0) if (ioctl(ether_fd, I_SETSIG, S_INPUT) != 0) { perror("after-uraid: I_SETSIG for ether failed:\n"); close(ether_fd); ether_fd = -1; return (-1); } #endif /* USE_DLPI */ #endif /* NOETHER */ #ifdef XWINDOW #ifdef I_SETSIG if (ioctl(ConnectionNumber(currentdsp->display_id), I_SETSIG, S_INPUT) < 0) perror("SETSIG on X fd failed"); #endif /* I_SETSIG */ #endif /* XWINDOW */ int_init(); #ifdef SUNDISPLAY LispReadFds |= (1 << LispWindowFd); #endif /* SUNDISPLAY */ #ifdef NOETHER #else LispReadFds |= EtherReadFds; #endif /* NOETHER */ #ifdef XWINDOW (currentdsp->device.after_raid)(currentdsp); LispReadFds |= (1 << ConnectionNumber(currentdsp->display_id)); flush_display_buffer(); #elif DOS (currentdsp->device.after_raid)(currentdsp); (currentmouse->device.after_raid)(currentmouse, currentdsp); (currentkbd->device.after_raid)(currentkbd); flush_display_buffer(); #endif /* XWINDOW | DOS */ int_timer_on(); *EmKbdAd068K = *EmRealUtilin68K = *EmKbdAd168K = *EmKbdAd268K = *EmKbdAd368K = *EmKbdAd468K = *EmKbdAd568K = KB_ALLUP; return (0); } /* device_after_raid */ /***********************************************************************/ /* func name :re_init_display(lisp_display_addr, display_max) int lisp_display_addr, display_max; Written by : Takeshi Shimizu Date: 6-May-1988 This should be called when returning LISP. Only called by device_after_raid */ /***********************************************************************/ #ifndef COLOR static int re_init_display(int lisp_display_addr, int display_max) { int mmapstat, size; struct pixrect *ColorFb; extern struct pixrect *ColorDisplayPixrect, *DisplayRegionPixrect; extern int DisplayType; #ifdef SUNDISPLAY union wait status; if (Win_security_p) { switch (vfork()) { case -1: /* Error */ (void)fprintf(stderr, "re_init_display: Fork failed.\n"); exit(1); case 0: /* Child */ (void)execl(SV_ACQUIRE, "sv_acquire", "0", "256", "250", 0); /* should not return */ (void)fprintf(stderr, "re_init_display: exec for sv_acquire failed\n"); exit(1); default: /* Parent */ /* do nothing */ break; } (void)wait(&status); /* child dies after changing 6 */ if (status.w_retcode != 0) { (void)fprintf(stderr, "re_init_display: failed to set ownership of win devices\n"); exit(1); } } mess_init(); if ((LispWindowFd = win_screennew(&LispScreen)) == -1) { fprintf(stderr, "init_display: can't create LispWindow\n"); return (-1); } else { #ifdef KBINT int_io_open(LispWindowFd); fcntl(LispWindowFd, F_SETFL, fcntl(LispWindowFd, F_GETFL, 0) | FNDELAY); #ifdef FX_AR_124 /* For AR 124. Type4 driver bug?? by m.matsuda */ { long i; for (i = 0; i < 900000; i++) ; } #endif /* FX_AR_124 */ #endif } #ifndef DISPLAYBUFFER /* for CGFOUR dev */ if (DisplayType == SUN4COLOR) { ColorFb = pr_open("/dev/fb"); pr_set_plane_group(ColorFb, PIXPG_OVERLAY_ENABLE); pr_rop(ColorFb, 0, 0, ColorFb->pr_width, ColorFb->pr_height, PIX_SET, 0, 0, 0); pr_set_plane_group(ColorFb, PIXPG_OVERLAY); } #else /* DISPLAYBUFFER is T */ /* ColorDisplayPixrect = pr_open("/dev/fb"); pr_putcolormap(ColorDisplayPixrect, 1, 1, &black, &black, &black); pr_putcolormap(ColorDisplayPixrect, 0, 1, &white, &white, &white); pr_putcolormap(ColorDisplayPixrect, 255, 1, &black, &black, &black); pr_putcolormap(ColorDisplayPixrect, (1<pr_depth)-1, 1, &black, &black, &black); ***/ #endif /* DISPLAYBUFFER */ init_cursor(); #ifndef DISPLAYBUFFER size = ((displaywidth * displayheight / 8 + (getpagesize() - 1)) & -getpagesize()); mmapstat = (int)mmap(DisplayRegion68k, size, PROT_READ | PROT_WRITE, #ifdef OS4 MAP_FIXED | #endif /* OS4 */ MAP_SHARED, FrameBufferFd, 0); if (mmapstat == -1) { fprintf(stderr, "re_init_display: ERROR at mmap system call\n"); fprintf(stderr, "errno = %d\n\n", errno); return (0); } copy_region(HideDisp68k, DisplayRegion68k, DisplayRasterWidth, displayheight); free(HideDisp68k); #endif /* DISPLAYBUFFER */ #ifdef DISPLAYBUFFER ColorDisplayPixrect = pr_open("/dev/fb"); flush_display_buffer(); /* refresh_CG6; */ #endif /* DISPLAYBUFFER */ #endif /* SUNDISPLAY */ return (0); } #else /* COLOR */ static int re_init_display(int lisp_display_addr, int display_max) { int mmapstat, size; struct pixrect *ColorFb; /* extern struct pixrect *color_source; */ struct pixrect *color_source; extern int DisplayType; #ifdef SUNDISPLAY union wait status; if (Win_security_p) { switch (vfork()) { case -1: /* Error */ (void)fprintf(stderr, "re_init_display: Fork failed.\n"); exit(1); case 0: /* Child */ (void)execl(SV_ACQUIRE, "sv_acquire", "0", "256", "250", 0); /* should not return */ (void)fprintf(stderr, "re_init_display: exec for sv_acquire failed\n"); exit(1); default: /* Parent */ /* do nothing */ break; } (void)wait(&status); /* child dies after changing 6 */ if (status.w_retcode != 0) { (void)fprintf(stderr, "re_init_display: failed to set ownership of win devices\n"); exit(1); } } mess_init(); if ((LispWindowFd = win_screennew(&LispScreen)) == -1) { fprintf(stderr, "init_display: can't create LispWindow\n"); return (-1); } else { #ifdef KBINT int_io_open(LispWindowFd); fcntl(LispWindowFd, F_SETFL, fcntl(LispWindowFd, F_GETFL, 0) | FNDELAY); #endif } #ifdef DISPLAYBUFFER if ((FrameBufferFd = open(LispScreen.scr_fbname, 2)) == -1) { perror("init_display: can't open FrameBuffer\n"); exit(-1); } #endif /* DISPLAYBUFFER */ restore_colormap(); if (MonoOrColor == MONO_SCREEN) { #ifndef DISPLAYBUFFER /* for CGFOUR dev */ if (DisplayType == SUN4COLOR) { ColorFb = pr_open("/dev/fb"); pr_set_plane_group(ColorFb, PIXPG_OVERLAY_ENABLE); pr_rop(ColorFb, 0, 0, ColorFb->pr_width, ColorFb->pr_height, PIX_SET, 0, 0, 0); pr_set_plane_group(ColorFb, PIXPG_OVERLAY); } #else /* DISPLAYBUFFER is T */ /* ColorDisplayPixrect = pr_open("/dev/fb"); pr_putcolormap(ColorDisplayPixrect, 1, 1, &black, &black, &black); pr_putcolormap(ColorDisplayPixrect, 0, 1, &white, &white, &white); pr_putcolormap(ColorDisplayPixrect, 255, 1, &black, &black, &black); pr_putcolormap(ColorDisplayPixrect, (1<pr_depth)-1, 1, &black, &black, &black); ***/ #endif /* DISPLAYBUFFER */ init_cursor(); #ifndef DISPLAYBUFFER size = ((displaywidth * displayheight / 8 + (getpagesize() - 1)) & -getpagesize()); mmapstat = (int)mmap(DisplayRegion68k, size, PROT_READ | PROT_WRITE, #ifdef OS4 MAP_FIXED | #endif /* OS4 */ MAP_SHARED, FrameBufferFd, 0); if (Inited_Color) mmapstat = (int)mmap(ColorDisplayRegion68k, Dispcolorsize, PROT_READ | PROT_WRITE, #ifdef OS4 MAP_FIXED | #endif /* OS4 */ MAP_SHARED, FrameBufferFd, 0x40000); if (mmapstat == -1) { fprintf(stderr, "re_init_display: ERROR at mmap system call\n"); fprintf(stderr, "errno = %d\n\n", errno); return (0); } /* restore mono image */ copy_region(HideDisp68k, DisplayRegion68k, DisplayRasterWidth, displayheight); free(HideDisp68k); if (Inited_Color) { /* restore color image */ copy_region(HideColorDisp68k, ColorDisplayRegion68k, DisplayRasterWidth * 8, displayheight); free(HideColorDisp68k); } /* end if( Inited_Color ) */ #endif /* DISPLAYBUFFER */ #ifdef DISPLAYBUFFER ColorDisplayPixrect = pr_open("/dev/fb"); flush_display_buffer(); /* refresh_CG6; */ #endif /* DISPLAYBUFFER */ } else { /* MonoOrColor is COLOR_SCREEN */ ColorFb = pr_open("/dev/fb"); #ifdef DISPLAYBUFFER ColorDisplayPixrect = ColorFb; #endif /* DISPLAYBUFFER */ color_source = mem_point(displaywidth, displayheight, 8, ColorDisplayRegion68k); pr_rop(ColorFb, 0, 0, displaywidth, displayheight, PIX_SRC, color_source, 0, 0); #ifndef DISPLAYBUFFER pr_set_plane_group(ColorFb, PIXPG_OVERLAY_ENABLE); pr_rop(ColorFb, 0, 0, ColorFb->pr_width, ColorFb->pr_height, PIX_CLR, 0, 0, 0); #endif /* DISPLAYBUFFER */ pr_set_plane_group(ColorFb, PIXPG_8BIT_COLOR); init_cursor(); mmapstat = (int)mmap(ColorDisplayRegion68k, Dispcolorsize, PROT_READ | PROT_WRITE, #ifdef OS4 MAP_FIXED | #endif MAP_SHARED, FrameBufferFd, 0x40000); if (mmapstat == -1) { perror("cgfour_init_color_display: ERROR at mmap system call\n"); error( "cgfour_init_color_display: ERROR at mmap system call\n You may be able to continue by " "typing 'q'"); /* printf("MMAP FAIL:BMBASE=0x%x\nNATIVE:= 0x%x\nLISPBASEN:= 0x%x\n", color_bitmapbase,ColorDisplayRegion68k,Lisp_world); */ return (NIL); } /* end if(mmapstat) */ #ifndef DISPLAYBUFFER /* restore mono image */ copy_region(HideDisp68k, DisplayRegion68k, DisplayRasterWidth, displayheight); free(HideDisp68k); #endif /* DISPLAYBUFFER */ /* restore coloe image */ copy_region(HideColorDisp68k, ColorDisplayRegion68k, DisplayRasterWidth * 8, displayheight); free(HideColorDisp68k); } /* end if(MonoOrColor) */ #endif /* SUNDISPLAY */ return (0); } #endif /* COLOR */