Cleanly separate Wedge logic from wrapper

Now there is one Wedge() for both environments. Wedge.c has a clearer
interface with the wrapper, and #includes a sensible set of headers. The
hand-rolled libc functions have been separated out, and memcpy() is no
longer used for overlapping ranges.
This commit is contained in:
Elliot Nunn 2018-01-14 09:45:39 +08:00
parent 7c5857f00b
commit 6902f7dc5b
7 changed files with 103 additions and 91 deletions

View File

@ -20,13 +20,13 @@ Apps = :Apps:
{IM} Ä :
{IM}RomWedge.x Ä {IM}WedgeStub.s.x {IM}printf.c.x {IM}Wedge.c.x
{IM}RomWedge.x Ä {IM}WedgeStub.s.x {IM}WedgeLibC.c.x {IM}Wedge.c.x
PPCLink -outputformat xcoff -codeorder source -roistext on -o {Targ} {Deps}
{IM}Linker Ä {IM}Linker.c.o
ILink -d -t 'MPST' -c 'MPS ' -o {Targ} {MpwToolLibs68k} {Deps}
{Apps}TestWedge Ä {IM}Wedge.c.x
{Apps}TestWedge Ä {IM}WedgeTool.c.x {IM}Wedge.c.x
PPCLink -d -t 'APPL' -c 'siow' -o {Targ} {Deps} {SiowLibsPPC}
Rez -a "{RIncludes}SIOW.r" -d DEFAULT_SAVE_PREF=1 -o {Targ}

104
Wedge.c
View File

@ -1,5 +1,7 @@
#include "PPCInfoRecordsPriv.h"
#include <MacTypes.h>
#include "Wedge.h"
#include <string.h>
#include <stdio.h>
#define kFlagNone 0
@ -36,36 +38,6 @@
#define MainCode ((unsigned short *)ROM)
void *memcpy(void *dest, void *src, long n)
{
long i;
char *d = (char *)dest;
char *s = (char *)src;
if(dest < src) /* copy left to right */
{
for(i=0; i<n; i++) d[i] = s[i];
}
else /* copy right to left */
{
for(i=n-1; i>=0; i--) d[i] = s[i];
}
return dest;
}
void *memset(void *dest, int v, long n)
{
char *d = (char *)dest;
while(n) d[--n] = (char)v;
return dest;
}
struct PME
{
unsigned long word1; /* LogicalPageIndexInSegment(16b) || PageCountMinus1(16b) */
@ -565,7 +537,7 @@ char *StealFromBank(NKSystemInfo *si, unsigned long len)
if(thisbank[1] == 0)
{
printf("using entire bank... ");
memcpy(thisbank, thisbank + 2, lastbank - thisbank);
memmove(thisbank, thisbank + 2, lastbank - thisbank);
lastbank[0] = lastbank[1] = 0;
}
@ -615,12 +587,12 @@ char *StealFromBankAligned(NKSystemInfo *si, unsigned long len)
}
/* erase the bank that we're cannibalising */
memcpy(thisbank, thisbank + 2, (lastbank + 2 - thisbank) * sizeof *thisbank);
memmove(thisbank, thisbank + 2, (lastbank + 2 - thisbank) * sizeof *thisbank);
lastbank -= 2;
if(bstart < mystart) /* new bank to my left */
{
memcpy(thisbank + 2, thisbank, (lastbank + 2 - thisbank) * sizeof *thisbank);
memmove(thisbank + 2, thisbank, (lastbank + 2 - thisbank) * sizeof *thisbank);
thisbank[0] = bstart;
thisbank[1] = mystart - bstart;
thisbank += 2;
@ -629,7 +601,7 @@ char *StealFromBankAligned(NKSystemInfo *si, unsigned long len)
if(myend < bend) /* new bank to my right */
{
memcpy(thisbank + 2, thisbank, (lastbank + 2 - thisbank) * sizeof *thisbank);
memmove(thisbank + 2, thisbank, (lastbank + 2 - thisbank) * sizeof *thisbank);
thisbank[0] = myend;
thisbank[1] = bend - myend;
thisbank += 2;
@ -673,14 +645,16 @@ int allocate256MBInSegment(NKConfigurationInfo *ci, NKSystemInfo *si, int seg)
}
/* Main function for Wedge patch */
void wedge(NKConfigurationInfo *ci, NKProcessorInfo *pi, NKSystemInfo *si, NKDiagnosticInfo *di, OSType rtasFour, unsigned long rtasProc, NKHWInfo *hi)
void Wedge(NKConfigurationInfo *ci, NKProcessorInfo *pi, NKSystemInfo *si, NKDiagnosticInfo *di, OSType rtasFour, char *rtasProc, NKHWInfo *hi, int isDryRun)
{
char ci_tmp[kConfigInfoSize], hi_tmp[kHardwareInfoSize];
int ret;
printf("Hello from the Wedge.\n");
if(isDryRun)
printf("Hello from the dry-run Wedge.\n");
else
printf("Hello from the Wedge.\n");
printf(" ConfigInfo (r3) @ %08x\n", ci);
printf(" ProcessorInfo (r4) @ %08x\n", pi);
printf(" SystemInfo (r5) @ %08x\n", si);
@ -707,8 +681,12 @@ void wedge(NKConfigurationInfo *ci, NKProcessorInfo *pi, NKSystemInfo *si, NKDia
if(!ret)
{
printf("Copying modified ConfigInfo and HWInfo over the originals.\n\n");
memcpy(ci, ci_tmp, sizeof ci_tmp);
memcpy(hi, hi_tmp, sizeof hi_tmp);
if(!isDryRun)
{
memcpy(ci, ci_tmp, sizeof ci_tmp);
memcpy(hi, hi_tmp, sizeof hi_tmp);
}
DebugDumpPageMap((NKConfigurationInfo *)ci);
}
@ -721,50 +699,10 @@ void wedge(NKConfigurationInfo *ci, NKProcessorInfo *pi, NKSystemInfo *si, NKDia
/* Insert more clever, interesting patches here. */
/* Uses r3-r9 -- compiler doesn't really need a prototype for this. */
printf("\nHanding over to the NanoKernel.\n");
NanoKernelJump(ci, pi, si, di, rtasFour, rtasProc, hi);
NanoKernel(ci, pi, si, di, rtasFour, rtasProc, hi);
}
/* Main function for MPW Tool */
void main(void)
{
char ci_tmp[kConfigInfoSize], hi_tmp[kHardwareInfoSize];
char *ci, *hi;
int ret;
printf("Hello from the (dry-run) Wedge.\n");
ci = (char *)0x68fef000UL;
printf(" ConfigInfo @ %08x\n", ci);
hi = *(char **)nkHWInfoPtr;
printf(" HardwareInfo @ %08x\n", hi);
printf("\n");
/* End of Wedge.c */
DebugDumpPageMap((NKConfigurationInfo *)ci);
printf("Copying the system ConfigInfo and HardwareInfo structs.\n\n");
memcpy(ci_tmp, ci, sizeof ci_tmp);
memcpy(hi_tmp, hi, sizeof hi_tmp);
ret = PatchMacOSAddressSpace(kPatchInfoRecord | kPatchUniversalArea | kPatchConfigInfoPage | kPatchKDP | kPatchEDP,
0x68000000UL,
(NKConfigurationInfo *)ci, (NKConfigurationInfo *)ci_tmp,
(NKHWInfo *)hi, (NKHWInfo *)hi_tmp);
if(!ret)
{
printf("PatchMacOSAddressSpace succeeded (but was forbidden from patching the ROM).\n\n");
DebugDumpPageMap((NKConfigurationInfo *)ci_tmp);
}
else
{
printf("PatchMacOSAddressSpace failed with error %d.\n", ret);
}
}

8
Wedge.h Normal file
View File

@ -0,0 +1,8 @@
/* Prototypes for calling into and out of the C wedge. */
#pragma once
#include "PPCInfoRecordsPriv.h"
void Wedge(NKConfigurationInfo *ci, NKProcessorInfo *pi, NKSystemInfo *si, NKDiagnosticInfo *di, OSType rtasFour, char *rtasProc, NKHWInfo *hi, int isDryRun);
void NanoKernel(NKConfigurationInfo *ci, NKProcessorInfo *pi, NKSystemInfo *si, NKDiagnosticInfo *di, OSType rtasFour, char *rtasProc, NKHWInfo *hi);

View File

@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "printf.h"
#include "WedgeLibC.h"
typedef void (*putcf) (void*,char);
void asm_putc (char);
@ -201,10 +201,47 @@ void tfp_format(char *fmt, va_list va)
}
extern void printf(char *fmt, ...)
extern int printf(char *fmt, ...)
{
va_list va;
va_start(va,fmt);
tfp_format(fmt,va);
va_end(va);
return 0; // should return character count
}
extern void *memmove(void *dest, void *src, unsigned int n)
{
unsigned int i;
char *d = (char *)dest;
char *s = (char *)src;
if(dest < src) /* copy left to right */
{
for(i=0; i<n; i++) d[i] = s[i];
}
else /* copy right to left */
{
for(i=n; i!=0; i--) d[i-1] = s[i-1];
}
return dest;
}
extern void *memcpy(void *dest, void *src, unsigned int n)
{
return memmove(dest, src, n);
}
extern void *memset(void *dest, int v, unsigned int n)
{
char *d = (char *)dest;
while(n) d[--n] = (char)v;
return dest;
}

View File

@ -93,6 +93,11 @@ regs Kusti, 23.10.2004
#include <stdarg.h>
extern void printf(char *fmt, ...);
// These barely match the prototypes in stdio.h
extern int printf(char *fmt, ...);
extern void *memmove(void *dest, void *src, unsigned int n);
extern void *memcpy(void *dest, void *src, unsigned int n);
extern void *memset(void *dest, int v, unsigned int n);
#endif

View File

@ -31,7 +31,7 @@ Magic equ 'Wdg_'
MakeFunction __start
import .wedge
import .Wedge
; Pointers in r20, scratch values in r0
@ -78,11 +78,12 @@ Magic equ 'Wdg_'
; Go
b .wedge
li r10, 0 ; isDryRun argument
b .Wedge
MakeFunction NanoKernelJump
MakeFunction NanoKernel
lisori r0, PA_ROM + NK

23
WedgeTool.c Normal file
View File

@ -0,0 +1,23 @@
#include "PPCInfoRecordsPriv.h"
#include "Wedge.h"
int main(void)
{
Wedge(
(NKConfigurationInfo *)0x68FEF000UL,
*(NKProcessorInfo **)nkProcessorInfoPtr,
*(NKSystemInfo **)nkSystemInfoPtr,
*(NKDiagnosticInfo **)nkDiagnosticInfoPtr,
(OSType)0, /* rtasFour */
NULL, /* rtasProc */
*(NKHWInfo **)nkHWInfoPtr,
1 /* isDryRun */
);
return 1; /* the above func should call NanoKernel instead of returning */
}
void NanoKernel(NKConfigurationInfo *ci, NKProcessorInfo *pi, NKSystemInfo *si, NKDiagnosticInfo *di, OSType rtasFour, char *rtasProc, NKHWInfo *hi)
{
exit(0);
}