mirror of
https://github.com/GnoConsortium/gno.git
synced 2025-02-07 02:30:56 +00:00
110 lines
3.2 KiB
C
110 lines
3.2 KiB
C
/* $Id: patch.c,v 1.1 1998/02/02 08:18:40 taubert Exp $ */
|
|
|
|
segment "KERN2 ";
|
|
|
|
#pragma optimize 79
|
|
|
|
#include "proc.h"
|
|
#include "gno.h"
|
|
#include "sys.h"
|
|
#include "sem.h"
|
|
#include "/lang/orca/libraries/orcacdefs/stdio.h"
|
|
#include "/lang/orca/libraries/orcacdefs/stdlib.h"
|
|
#include <memory.h>
|
|
#include <gsos.h>
|
|
#include <event.h>
|
|
#include <locator.h>
|
|
|
|
struct patchEntry {
|
|
word toolNum;
|
|
longword oldFunc,newFunc;
|
|
longword *chainPoint;
|
|
};
|
|
|
|
/* tool patch entry points */
|
|
extern byte NULLTOOLFUNC;
|
|
extern byte OURSYSFAILMGR;
|
|
extern byte SaveAllPatch;
|
|
extern byte RestAllPatch;
|
|
extern byte QDSTARTUPPATCH;
|
|
extern byte SANESUPATCH;
|
|
extern byte SANESDPATCH;
|
|
extern byte SANESTPATCH;
|
|
extern byte TDISPOSEHAND;
|
|
extern byte NewGetNextEvent, NewEMStartUp, NewGetOSEvent, NewOSEventAvail,
|
|
NewEMShutDown,NewEventAvail;
|
|
|
|
/* tool patch 'old' vectors, for patches that want to call the old routine */
|
|
extern longword OLDSAVEALL, OLDRESTALL, OLDQDSTARTUP, OLDSANESU, OLDDISPHAND;
|
|
extern longword OldGetNextEvent, OldOSEventAvail, OldGetOSEvent, OldEventAvail;
|
|
|
|
static struct patchEntry patchArray[] = {
|
|
{ 0x0B05, 0l, (longword) (&SaveAllPatch), &OLDSAVEALL },
|
|
{ 0x0C05, 0l, (longword) (&RestAllPatch), &OLDRESTALL },
|
|
{ 0x0204, 0l, (longword) (&QDSTARTUPPATCH), &OLDQDSTARTUP },
|
|
{ 0x020A, 0l, (longword) (&SANESUPATCH), &OLDSANESU },
|
|
{ 0x0201, 0l, (longword) (&NULLTOOLFUNC), NULL },
|
|
{ 0x0301, 0l, (longword) (&NULLTOOLFUNC), NULL },
|
|
{ 0x1503, 0l, (longword) (&OURSYSFAILMGR), NULL },
|
|
{ 0x030A, 0l, (longword) (&SANESDPATCH), NULL },
|
|
{ 0x060A, 0l, (longword) (&SANESTPATCH), NULL },
|
|
/* { 0x1002, 0l, (longword) (&TDISPOSEHAND), &OLDDISPHAND }, */
|
|
{ 0x0206, 0l, (longword) (&NewEMStartUp), NULL },
|
|
{ 0x0A06, 0l, (longword) (&NewGetNextEvent), &OldGetNextEvent },
|
|
{ 0x0B06, 0l, (longword) (&NewEventAvail), &OldEventAvail },
|
|
{ 0x1606, 0l, (longword) (&NewGetOSEvent), &OldGetOSEvent },
|
|
{ 0x1706, 0l, (longword) (&NewOSEventAvail), &OldOSEventAvail },
|
|
{ 0x0306, 0l, (longword) (&NewEMShutDown), NULL },
|
|
{ ~0, 0l, 0l, NULL}};
|
|
|
|
void patchTools(void)
|
|
{
|
|
longword *TLfunc;
|
|
int i;
|
|
word Tool, Func;
|
|
|
|
i = 0;
|
|
while ((Tool = patchArray[i].toolNum) != ~0) {
|
|
Func = (Tool & 0xFF00) >> 8;
|
|
Tool &= 0xff;
|
|
TLfunc = (longword *) GetTSPtr(0x0000, Tool);
|
|
patchArray[i].oldFunc = TLfunc[Func];
|
|
if (patchArray[i].chainPoint) {
|
|
if (*(patchArray[i].chainPoint)) {
|
|
/* takes care of jmp >$000000 patches */
|
|
*(patchArray[i].chainPoint) |= ((TLfunc[Func]+1) << 8);
|
|
} else {
|
|
/* takes care of dc i4'0' patches */
|
|
*(patchArray[i].chainPoint) = TLfunc[Func]+1;
|
|
}
|
|
}
|
|
#ifdef DEBUG_TOOL_PATCH
|
|
printf("%lx %lx %lx %lx %lx\n", &TLfunc[Func], patchArray[i].oldFunc,
|
|
patchArray[i].chainPoint, *(patchArray[i].chainPoint),
|
|
patchArray[i].newFunc);
|
|
#endif
|
|
TLfunc[Func] = patchArray[i].newFunc-1;
|
|
#ifdef DEBUG_TOOL_PATCH
|
|
printf(" %lx\n", TLfunc[Func]);
|
|
#endif
|
|
i++;
|
|
}
|
|
}
|
|
|
|
void unpatchTools(void)
|
|
{
|
|
longword *TLfunc;
|
|
int i;
|
|
word Tool, Func;
|
|
|
|
i = 0;
|
|
while ((Tool = patchArray[i].toolNum) != -1) {
|
|
Func = (Tool & 0xFF00) >> 8;
|
|
Tool &= 0xff;
|
|
TLfunc = (longword *) GetTSPtr(0x0000, Tool);
|
|
TLfunc[Func] = patchArray[i].oldFunc;
|
|
i++;
|
|
}
|
|
}
|
|
|