Commit c2f2a3d4 authored by Robert Sprowson's avatar Robert Sprowson
Browse files

Apply a patch to the Desk library during the export phase.

Patches over the two unaligned loads (found by looking for left shift 16
followed by right shift 16). Was causing OmniClient to abort on ARMv7.
Thanks to the moderator Philip Ludlam for permission to do this.
Tagged as Desk-3_2_5-NoUnaligned
parent 86922f5a
......@@ -93,8 +93,10 @@ include CLibrary
${LIBEXT}.${LIBRARY}: !Desk.o.Normal
${CP} !Desk.o.Normal $@ ${CPFLAGS}
BASIC -quit Patch325 $@
${LIBEXT}.${LIBRARYZM}: !Desk.o.Normalzm
${CP} !Desk.o.Normalzm $@ ${CPFLAGS}
BASIC -quit Patch325 $@
# Dynamic dependencies:
REM Patch two unaligned loads in Desk and Desk_M in 3.2.5
REM Fails loudly if the original binary doesn't match
:
SYS"OS_GetEnv" TOcmd$
IFINSTR(cmd$,"o.")=0 THENPRINT"No library specified":STOP
lib$=RIGHT$(cmd$,LENcmd$-INSTR(cmd$,"o.")+1)
:
maxlib%=512*1024
DIM lib% maxlib%
DIM code% 512
:
SYS"XOS_File",5,lib$ TOtype%,,,,length%
IF(type%<>1) THENPRINT"Library not found":STOP
IF(length%>maxlib%) THENPRINT"Library too big":STOP
SYS"OS_File",255,lib$,lib%,0
PRINT"Patching "lib$
CASElib$ OF
WHEN"o.Desk_M":
P%=code%
REM DeskM old code sequence at +&17884 versus new
[ OPT2
.p1start
ADD R3,R1,R2 : ADD R3,R1,R2
LDR R12,[R3,R0,LSL #1] : LDRB R12,[R3,R0,LSL #1]! \Writeback here so we have byte address
MOV R12,R12,LSL #16 : LDRB R2,[R3,#1]
MOV R12,R12,ASR #16 : ORR R12,R12,R2,LSL #8 \Don't need sign extension
ADD R2,R12,#1 : ADD R2,R12,#1
STRB R2,[R3,R0,LSL #1]! : STRB R2,[R3,#0]
MOV R2,R2,ASR #8 : MOV R2,R2,ASR #8
STRB R2,[R3,#1] : STRB R2,[R3,#1]
CMP R12,#0 : CMP R12,#0
MOVNE PC,R14 : MOVNE PC,R14
.p1stop
]
REM DeskM old code sequence at +&178E0 versus new
[ OPT2
.p2start
ADD R2,R2,R1 : ADD R2,R2,R1
LDR R1,[R2,R0,LSL #1] : LDRB R1,[R2,R0,LSL #1]! \Writeback here so we have byte address
SUB R1,R1,#1 : LDRB R3,[R2,#1]
MOV R1,R1,LSL #16 : ORR R1,R1,R3,LSL #8
MOVS R1,R1,ASR #16 : SUBS R1,R1,#1 \Deferred
STRB R1,[R2,R0,LSL #1]! : STRB R1,[R2,#0]
MOV R3,R1,ASR #8 : MOV R3,R1,ASR #8
STRB R3,[R2,#1] : STRB R3,[R2,#1]
MOVNE PC,R14 : MOVNE PC,R14
.p2stop
]
PROCpatch325apply(&17884,p1start,p1stop-p1start)
PROCpatch325apply(&178E0,p2start,p2stop-p2start)
WHEN"o.Desk":
P%=code%
REM Desk old code sequence at +&16C3C versus new
[ OPT2
.p1start
LDR R2,[R3,R0,LSL #1] : LDRB R2,[R3,R0,LSL #1]! \Writeback here so we have byte address
MOV R2,R2,LSL #16 : LDRB R1,[R3,#1]
MOV R2,R2,ASR #16 : ORR R2,R2,R1,LSL #8 \Don't need sign extension
ADD R1,R2,#1 : ADD R1,R2,#1
STRB R1,[R3,R0,LSL #1]! : STRB R1,[R3,#0]
MOV R1,R1,ASR #8 : MOV R1,R1,ASR #8
STRB R1,[R3,#1] : STRB R1,[R3,#1]
CMP R2,#0 : CMP R2,#0
.p1stop
]
REM Desk old code sequence at +&16C8C versus new
[ OPT2
.p2start
LDR R1,[R2,R0,LSL #1] : LDRB R1,[R2,R0,LSL #1] \Writeback here so we have byte address
SUB R1,R1,#1 : LDRB R3,[R2,#1]
MOV R1,R1,LSL #16 : ORR R1,R1,R3,LSL #8
MOVS R1,R1,ASR #16 : SUBS R1,R1,#1 \Deferred
STRB R1,[R2,R0,LSL #1]! : STRB R1,[R2,#0]
MOV R3,R1,ASR #8 : MOV R3,R1,ASR #8
STRB R3,[R2,#1] : STRB R3,[R2,#1]
MOVNE PC,R14 : MOVNE PC,R14
.p2stop
]
PROCpatch325apply(&16C3C,p1start,p1stop-p1start)
PROCpatch325apply(&16C8C,p2start,p2stop-p2start)
ENDCASE
SYS"XOS_File",10,lib$,&FFD,,lib%,lib%+length%
END
:
DEFPROCpatch325apply(offset%,code%,length%)
REM To allow side by side before and after patch, the code needs
REM deinterleaving here
LOCAL loop%
FORloop%=0 TO(length%-1) STEP8
IF!(lib%+offset%+(loop% DIV2)+0)=!(code%+loop%+0) THEN
!(lib%+offset%+(loop% DIV2)+0)=!(code%+loop%+4)
ELSE
PRINT"Patch word "loop% DIV2;" not found":STOP
ENDIF
NEXT
ENDPROC
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment