From 32d3421728422a19e1b1b5b469b4fbd771a3439d Mon Sep 17 00:00:00 2001 From: Elliot Nunn Date: Sun, 28 Jul 2019 16:16:05 +0800 Subject: [PATCH] Traditional mini patches --- kauai-ata.pef | Bin 0 -> 22380 bytes macmini.py | 217 ++++++++++++++++++++++++++++++++++++++++++++++++ mactron.cicn | Bin 0 -> 978 bytes patch_common.py | 46 ++++++++++ 4 files changed, 263 insertions(+) create mode 100644 kauai-ata.pef mode change 100644 => 100755 macmini.py create mode 100644 mactron.cicn create mode 100644 patch_common.py diff --git a/kauai-ata.pef b/kauai-ata.pef new file mode 100644 index 0000000000000000000000000000000000000000..1b95c2468ce330be50fbd33fc0b2ff3ca62e16d7 GIT binary patch literal 22380 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 T$oML3?uR7d>k{nSMw0$N|D=jz literal 0 HcmV?d00001 diff --git a/macmini.py b/macmini.py old mode 100644 new mode 100755 index 63f77b6..bcba6be --- a/macmini.py +++ b/macmini.py @@ -1,2 +1,219 @@ #!/usr/bin/env python3 +import patch_common + +from os import path +import shutil +import os +import struct + + +src, cleanup = patch_common.get_src(desc=''' +Boot the Mac mini. Works on Mac OS ROM v6.7 and later (Mac OS 9.1, late '01). +First, patches the boot script to (a) add PowerMac10,1/2 to the COMPATIBLE tag, +(b) pretend that the machine is a Cube and (c) add a prim-info property to the +PMU device. Second, patches the NanoKernel to prevent the CPU Plugin from +hanging when a THRM register access silently fails. Third, if necessary, patches +the Kauai ATA driver into old ROMs (pre-9.1). +''') + + +def sign_extend(value, bits): + sign_bit = 1 << (bits - 1) + return (value & (sign_bit - 1)) - (value & sign_bit) + + +def patch_nk_proc_table(orig): + try: + code = bytearray(orig) + + # find the processor flags table, and make our glorious G4 known... + # our reference point is the ConfigInfo-tyle 601 info, which comes right after + tbl = code.index(b'\x00\x00\x10\x00\x00\x00\x80\x00\x00\x00\x80\x00\x00\x20\x00\x20\x00\x01\x00\x40\x00\x40\x00\x20\x00\x20\x00\x20\x00\x08\x00\x08\x01\x00\x00\x02') + num_entries = 0 + for i in reversed(range(0, tbl, 4)): + if code[i] and code[i+1]: + break + num_entries += 1 + + assert num_entries == 32 + tbl -= (1+1+4) * num_entries + print('NK PowerCall table patch: location @', hex(tbl)) + + pvr = 16 + 3 # 0x8003 + + code[tbl + pvr] = 0x23 # upper nib means use NAP bit, lower nib I can't remember + tbl += num_entries + code[tbl + pvr] = 2 # HID0_NHR_and_sleep + tbl += num_entries + struct.pack_into('>L', code, tbl + 4*pvr, 0x1F) # hasL2CR hasPLRUL1 hasTAU hasVMX hasMSSregs + + return bytes(code) + + except: + print('NK PowerCall table patch: patch failed') + return orig + + +# On the 7447a (or something), accesses to the THRM registers fail silently, +# causing the CPU Plugin to hang when asked to get the temp. Patch the NK to +# test for a non-THRM CPU, and return an error in this case. (The NK is involved +# because it invokes the CPUP fragment in supervisor mode in response to an +# MPCpuPlugin call.) + +def patch_nk_mpcpuplugin(orig): + try: + # For picking apart PPC stuff, turn it into a list of longs... + while len(orig) % 4: orig.append(b'\0') # first ensure 4-aligned + code = [x for (x,) in struct.iter_unpack('>L', orig)] + + # find syscall dispatch routine + for i in range(3, len(code)): + if code[i] == 0x92E80020: # stw r23, 0x20(r8) + if code[i-1] == 0x92E90020: # stw r23, 0x20(r9) + i -= 1 # ignore this annoying instruction + + if code[i-3] >> 16 == 0x3EE0 and code[i-2] >> 16 == 0x62F7 and code[i-1] == 0x7EF7CA14: + # lis r23, HI; ori r23, r23, LO; add r23, r23, r25 + mpdisp = ((code[i-3] & 0xFFFF) << 16) + (code[i-2] & 0xFFFF) + if code[mpdisp//4] == 0x7C3042A6: continue # FP hander has same offset in diff table + print('NK MPCpuPlugin patch: MPDispatch @', hex(mpdisp)) + break + elif code[i-1] >> 16 == 0x3AF9: # addi r23, r25, LO + mpdisp = code[i-1] & 0xFFFF + if code[mpdisp//4] == 0x7C3042A6: continue # FP hander has same offset in diff table + print('NK MPCpuPlugin patch: MPDispatch @', hex(mpdisp)) + break + + # find routine's table + for i in range(mpdisp//4, len(code)): + if code[i] & 0xFC000003 == 0x48000000: # short unconditional non-link jump to end of table + mpcnt = (code[i] & 0x3FFFFFF) // 4 - 1 + mptab = (i + 1) * 4 + print('NK MPCpuPlugin patch: MPDispatchTable @', hex(mptab)) + break + + # MP calls invoked via "li r0, NUMBER; sc", and this is that number: + kMPCPUPlugin = 46 + + if mpcnt > kMPCPUPlugin: + mpcpuplugin = code[mptab//4 + kMPCPUPlugin] + 4*kMPCPUPlugin # weird table + print('NK MPCpuPlugin patch: MPCpuPlugin @', hex(mpcpuplugin)) + + for i in range(mpcpuplugin//4, len(code)): + if code[i] & 0xFC000003 == 0x48000000: # short unconditional non-link jump to call return routine + returnproc = sign_extend(code[i] & 0x3FFFFFF, 26) + i*4 + print('NK MPCpuPlugin patch: return proc @', hex(returnproc)) + break + + # insert our new implementation into the table + code[mptab//4 + kMPCPUPlugin] = 4*len(code) - 4*kMPCPUPlugin + + print('NK MPCpuPlugin patch: new MPCpuPlugin @', hex(len(code)*4)) + + # place our new implementation at the end of the NK + code.extend([ + 0x2C03000C, # cmpwi r3, kGetProcessorTemp + 0x40820020, # bne passthru + 0x7D1F42A6, # mfpvr r8 + 0x5508001E, # rlwinm r8, r8, 0, 0xFFFF0000 + 0x3D208003, # lis r9, 0x8003 + 0x7C084800, # cmpw r8, r9 + 0x4082000C, # bne passthru + 0x3860CD2B, # li r3, kCantReportProcessorTemperatureErr + # place a return path branch here + # place a passthru branch here + ]) + + # add those two unconditional branches + for targ in [returnproc, mpcpuplugin]: + inst = targ - len(code)*4 + inst = inst & 0x3FFFFFF + inst |= 0x48000000 + code.append(inst) + + return b''.join(struct.pack('>L', x) for x in code) + + except: + print('NK MPCpuPlugin patch: patch failed') + return orig + + +FORTH = r''' +\ Hacks for Mac mini, should not affect other machines +" /" select-dev " model" active-package get-package-property 0= if + decode-string 2swap 2drop 2dup " PowerMac10,1" $= -rot " PowerMac10,2" $= or if + + \ Pretend to be a Power Mac G4 Cube + " /" select-dev + " PowerMac5,1" encode-string 2dup + " model" property + " MacRISC" encode-string encode+ + " MacRISC2" encode-string encode+ + " Power Macintosh" encode-string encode+ + " compatible" property + device-end + + \ Pretend to have a PowerPC 7445/55, actual PVR unaffected + " /cpus/PowerPC,G4@0" select-dev + 80010201 encode-int " cpu-version" property + device-end + + \ Set prim-info (for PwrMgr v2 in NativePowerMgrLib) + " via-pmu/power-mgt" select-dev + 000000ff encode-int + 0000002c encode-int encode+ + 00030d40 encode-int encode+ + 0001e705 encode-int encode+ + 00001400 encode-int encode+ + 00000000 encode-int encode+ + 0000260d encode-int encode+ + 46000270 encode-int encode+ + " prim-info" property + device-end + + then +then \ End of mini hacks +'''.strip() + +def patch_booter(text): + text = text.replace('\n', '\nPowerMac10,1 PowerMac10,2 ', 1) + text = text.replace('', '\n'+FORTH, 1) + return text + + +for (parent, folders, files) in os.walk(src): + folders.sort(); files.sort() # make it kinda deterministic + for filename in files: + full = path.join(src, parent, filename) + + if filename.startswith('NanoKernel'): + code = open(full, 'rb').read() + code = patch_nk_proc_table(code) + code = patch_nk_mpcpuplugin(code) + open(full, 'wb').write(code) + + elif filename == 'Bootscript': + text = open(full).read() + text = patch_booter(text) + open(full, 'w').write(text) + + elif filename == 'Parcelfile': + if not path.exists(path.join(src, parent, 'kauai-ata.pef')): + print('ROM lacks Kauai ATA driver (< ROM 9.1), patching it in') # the only known version + shutil.copy(path.join(path.dirname(__file__), 'kauai-ata.pef'), path.join(src, parent)) + + with open(full, 'a') as f: + f.write('prop flags=0x0000c a=kauai-ata b=ata\n') + f.write('\tndrv flags=0x00006 name=driver,AAPL,MacOS,PowerPC src=kauai-ata.pef.lzss\n\n') + + if path.exists(path.join(src, parent, 'MotherBoardHAL.pef')): + print('ROM has MotherBoardHAL (< ROM 6.7), therefore unlikely to work') + + elif filename == 'cicn_-20020': + print('Patching Happy Mac as tradition dictates. Credit to MacTron:') + print('http://macos9lives.com/smforum/index.php/topic,4354.msg30328.html#msg30328') + shutil.copyfile(path.join(path.dirname(__file__), 'mactron.cicn'), full) + + +cleanup() diff --git a/mactron.cicn b/mactron.cicn new file mode 100644 index 0000000000000000000000000000000000000000..9dd013ff6ba026174acc49b96f4dfb164ab43a47 GIT binary patch literal 978 zcmcgqJ5Iwu5FIChgm1h-iYt_0fl{J~+6@&o59J7do*5z%vq7ts)p!woiUL@f$n+o(M5#0DD}v-&UV8uPVn zTpK?WvYi+c_9&=Lsj$Zuz{l3KTIVe6wLc_|&$#n$UHA2omyI>9-9hJ^F}JNcCNcsF z7JxC-;B~Q}rUtOK%2Hx?h~{(bcE1JGE(O$?3uy0EK>LM&4srn<-U;Yv1|WaeR>nuv zfUg_JBR=sM$MI#wy`$n+4pvW=N^sh!^s$Om7DcMGJW*)`nt8qdpz)-&E?n1o1bw0$ zPgDk;W-cE2wb7Hv>rsvtrM})+sb78n