1
0
mirror of https://github.com/upx/upx synced 2025-10-05 19:20:23 +08:00

Some atari/tos cleanups.

This commit is contained in:
Markus F.X.J. Oberhumer 2006-11-18 02:39:11 +01:00
parent 8146e9cbcd
commit cd0efe3edb
5 changed files with 1322 additions and 1257 deletions

View File

@ -117,9 +117,13 @@ void PackTos::buildLoader(const Filter *ft)
initLoader(nrv_loader, sizeof(nrv_loader));
//linker->dumpSymbols();
//
// part 1a
//
addLoader("entry");
if (symbols.up21_a6 > 0 && symbols.up21_a6 <= 32767)
if (symbols.up21_a6 <= 32767)
addLoader("set_up21_a6.w");
else if (symbols.up21_d4 <= 32767)
addLoader("set_up21_d4.w");
@ -167,17 +171,22 @@ void PackTos::buildLoader(const Filter *ft)
symbols.up31_d4 = symbols.up31_base_d4 + getDecomprOffset(ph.method, opt->small);
symbols.up31_a6 = symbols.up31_base_a6 + getDecomprOffset(ph.method, opt->small);
if (symbols.up31_a6 > 0 && symbols.up31_a6 <= 32767)
if (symbols.up31_a6 <= 32767)
addLoader("jmp_decompressor_a6.w");
else if (symbols.up31_d4 <= 32767)
addLoader("jmp_decompressor_d4.w");
else if (symbols.up31_a6 >= 32768 && symbols.up31_a6 <= 65534)
else if (symbols.up31_a6 <= 65534)
addLoader("jmp_decompressor_a6.w2");
else
addLoader("jmp_decompressor_d4.l");
addLoader("clear_bss");
//
// part 1b
//
addLoader("code_on_stack");
addLoader("clear_dirty_bss");
addLoader("loop3_label");
addLoader(opt->small ? "loop3.small" : "loop3.fast");
if (symbols.loop3.mode == symbols.LOOP_SUBQ_L)
@ -190,11 +199,18 @@ void PackTos::buildLoader(const Filter *ft)
throwBadLoader();
addLoader("flush_cache");
addLoader("restore_stack");
#if 0
addLoader("clear_dirty_stack");
#endif
addLoader("start_program");
addLoader("IDENTSTR,+40D,UPX1HEAD,CUTPOINT");
//
// part 2
//
if (M_IS_NRV2B(ph.method)) {
addLoader(opt->small ? "nrv2b_8.small" : "nrv2b_8.fast");
} else if (M_IS_NRV2D(ph.method)) {
@ -514,7 +530,7 @@ void PackTos::pack(OutputFile *fo)
d_len = lsize - e_len;
assert((e_len & 3) == 0 && (d_len & 1) == 0);
// compute addresses
// compute section sizes
o_text = e_len;
o_data = ph.c_len;
o_bss = i_bss;
@ -528,6 +544,7 @@ void PackTos::pack(OutputFile *fo)
// append decompressor (part 2 of loader)
d_off = o_data;
////memcpy(obuf + d_off, getLoader() + e_len, d_len); // must be done after relocation
o_data += d_len;
// dword align the len of the final data segment
@ -577,13 +594,16 @@ void PackTos::pack(OutputFile *fo)
symbols.up31_base_d4 = d_off + offset;
symbols.up21_a6 = symbols.up21_d4 - (i_text + i_data);
symbols.up31_base_a6 = symbols.up31_base_d4 - (i_text + i_data);
assert((int)symbols.up21_a6 > 0);
assert((int)symbols.up31_base_a6 > 0);
const unsigned c = linker->getSymbolOffset("code_on_stack");
unsigned d;
d = linker->getSymbolOffset("flush_cache_rts") - linker->getSymbolOffset("clear_bss");
d = linker->getSymbolOffset("flush_cache_rts") - c;
symbols.flush_cache_rts_offset = d;
d = linker->getSymbolOffset("clear_dirty_stack_loop") - linker->getSymbolOffset("clear_bss");
d = linker->getSymbolOffset("clear_dirty_stack_loop") - c;
symbols.clear_dirty_stack_len = (d + 3) / 4 + 32 - 1;
d = linker->getSymbolOffset("clear_bss_end") - linker->getSymbolOffset("clear_bss");
d = linker->getSymbolOffset("code_on_stack_end") - c;
symbols.copy_to_stack_len = d / 2 - 1;
// now re-build loader
@ -611,16 +631,16 @@ void PackTos::pack(OutputFile *fo)
linker->defineSymbol("orig_p_dlen", i_data);
linker->defineSymbol("orig_p_blen", i_bss);
if (symbols.up21_a6 > 0 && symbols.up21_a6 <= 32767)
if (symbols.up21_a6 <= 32767)
linker->defineSymbol("up21_a6", symbols.up21_a6);
else
linker->defineSymbol("up21_d4", symbols.up21_d4);
if (symbols.up31_a6 > 0 && symbols.up31_a6 <= 32767)
if (symbols.up31_a6 <= 32767)
linker->defineSymbol("up31_a6", symbols.up31_a6);
else if (symbols.up31_d4 <= 32767)
linker->defineSymbol("up31_d4", symbols.up31_d4);
else if (symbols.up31_a6 >= 32768 && symbols.up31_a6 <= 65534)
else if (symbols.up31_a6 <= 65534)
linker->defineSymbol("up31_a6", symbols.up31_a6 - 32767);
else
linker->defineSymbol("up31_d4", symbols.up31_d4);
@ -675,13 +695,13 @@ void PackTos::pack(OutputFile *fo)
MemBuffer loader(o_text);
memcpy(loader, getLoader(), o_text);
patchPackHeader(loader, o_text);
memcpy(obuf+d_off, getLoader() + e_len, d_len);
// write new file header, loader and compressed file
fo->write(&oh, FH_SIZE);
fo->write(loader, o_text); // entry
if (opt->debug.dump_stub_loader)
OutputFile::dump(opt->debug.dump_stub_loader, loader, o_text);
memcpy(obuf + d_off, getLoader() + e_len, d_len); // copy decompressor
fo->write(obuf, o_data); // compressed + decompressor
// write empty relocation fixup

View File

@ -620,7 +620,7 @@ tc.m68k-atari.tos.gcc += -fno-exceptions -fno-asynchronous-unwind-tables
tc.m68k-atari.tos.gcc += -Wall -W -Wcast-align -Wcast-qual -Wwrite-strings -Werror
m68k-atari.tos.h : $(srcdir)/src/$$T.S
$(call tc,gcc) -c -x assembler-with-cpp -Wa,-m68040,-l,--pcrel,--register-prefix-optional $< -o tmp/$T.bin
$(call tc,gcc) -c -x assembler-with-cpp -Wa,-m68000,-l,--pcrel,--register-prefix-optional $< -o tmp/$T.bin
$(call tc,f-embed_objinfo,tmp/$T.bin)
$(call tc,bin2h) --ident=nrv_loader tmp/$T.bin $@

File diff suppressed because it is too large Load Diff

View File

@ -294,10 +294,10 @@ section copy_to_stack
// Copy the final startup code below the stack. This will get
// called via "jmp (ASTACK)" after decompression and relocation.
lea.l clear_bss_end:w(pc),a0
lea.l code_on_stack_end:w(pc),a0
move.l d4,-(ASTACK) // entry point for final jmp
//moveq.l #((clear_bss_end-clear_bss)/2-1),d5
////moveq.l #((code_on_stack_end-code_on_stack)/2-1),d5
moveq.l #copy_to_stack_len,d5
1: move.w -(a0),-(ASTACK)
subq.l #1,d5
@ -307,7 +307,7 @@ section copy_to_stack
#ifdef FLUSH_CACHE
// patch code: on the stack, the 'rts' becomes a 'nop'
//move.w #0x4e71,(flush_cache_rts-clear_bss):w(ASTACK)
////move.w #0x4e71,(flush_cache_rts-code_on_stack):w(ASTACK)
move.w #0x4e71,flush_cache_rts_offset:w(ASTACK)
bsrs flush_cache
@ -366,17 +366,18 @@ section jmp_decompressor_d4.l
// this is the final part of the startup code which runs in the stack
**************************************************************************/
// ------------- clear dirty bss
section clear_bss
section code_on_stack
// on entry:
// ASTACK == pc == clear_bss (on stack)
// ASTACK == pc == code_on_stack (on stack)
// a6 start of dirty bss [long living register]
// d6.l number of clr loops
// d6 number of clr loops for clear_dirty_bss
// d3.l 0
// ------------- clear dirty bss
section clear_dirty_bss
section loop3_label
section loop3.small
move.l d3,(a6)+
@ -413,20 +414,19 @@ GL(flush_cache_rts) // for flush_cache_rts_offset
#endif
// ------------- restore ASTACK
// ------------- restore stack
section clear_dirty_stack
section restore_stack
//lea clear_bss_size+4:w(ASTACK),sp
lea clear_bss_end+4:w(pc),sp
// assert sp == clear_bss_end(pc)+4
lea code_on_stack_end+4:w(pc),sp
// ------------- clear the dirty stack
// clear down to clear_bss(pc) + 32 extra longs
////moveq.l #((clear_dirty_stack_loop-clear_bss+3)/4+32-1),d0
section clear_dirty_stack
// clear down to code_on_stack(pc) + 32 extra longs
////moveq.l #((clear_dirty_stack_loop-code_on_stack+3)/4+32-1),d0
moveq.l #clear_dirty_stack_len,d0
lea 1f(pc),a0
GL(clear_dirty_stack_loop) // for clear_dirty_stack_len
@ -445,7 +445,7 @@ section start_program
1: dc.w 0x4ef9 // jmp $xxxxxxxx - jmp to text segment
GL(clear_bss_end) // for copy_to_stack_len
GL(code_on_stack_end) // for copy_to_stack_len
/*************************************************************************
@ -549,7 +549,7 @@ section reloc
// note: d3.l is still 0
move.l a6,a0 // a0 = start of relocations
moveq.l #1,d5
moveq.l #1,d1
move.l d4,a1
add.l (a0)+,a1 // get initial fixup
@ -558,12 +558,14 @@ section reloc
add.l d4,(a1) // reloc one address
2: move.b (a0)+,d3
beqs 3f
cmp.b d5,d3 // note: d5.b is #1 from above
cmp.b d1,d3 // note: d1.b is #1 from above
bnes 1b
lea 254(a1),a1 // d3 == 1 -> add 254, don't reloc
bras 2b
3:
// note: d3.l is still 0
// ------------- clear dirty bss & start program
@ -581,7 +583,7 @@ section jmp_stack
// We are currently running in the dirty bss.
// Jump to the code we copied below the stack.
jmp (ASTACK) // jmp clear_bss (on stack)
jmp (ASTACK) // jmp code_on_stack (on stack)
/*************************************************************************

View File

@ -25,34 +25,36 @@ Idx Name Size VMA LMA File off Algn Flags
20 jmp_decompressor_d4.w 00000006 00000000 00000000 00000100 2**0 CONTENTS, RELOC, READONLY
21 jmp_decompressor_a6.w2 00000008 00000000 00000000 00000106 2**0 CONTENTS, RELOC, READONLY
22 jmp_decompressor_d4.l 0000000a 00000000 00000000 0000010e 2**0 CONTENTS, RELOC, READONLY
23 clear_bss 00000000 00000000 00000000 00000118 2**0 CONTENTS, READONLY
24 loop3_label 00000000 00000000 00000000 00000118 2**0 CONTENTS, READONLY
25 loop3.small 00000002 00000000 00000000 00000118 2**0 CONTENTS, READONLY
26 loop3.fast 00000008 00000000 00000000 0000011a 2**0 CONTENTS, READONLY
27 loop3_subql 00000004 00000000 00000000 00000122 2**0 CONTENTS, RELOC, READONLY
28 loop3_subqw 00000004 00000000 00000000 00000126 2**0 CONTENTS, RELOC, READONLY
29 loop3_dbra 00000004 00000000 00000000 0000012a 2**0 CONTENTS, RELOC, READONLY
30 flush_cache 00000078 00000000 00000000 0000012e 2**0 CONTENTS, READONLY
31 clear_dirty_stack 00000010 00000000 00000000 000001a6 2**0 CONTENTS, RELOC, READONLY
32 start_program 0000000c 00000000 00000000 000001b6 2**0 CONTENTS, READONLY
33 UPX1HEAD 00000020 00000000 00000000 000001c2 2**0 CONTENTS, READONLY
34 CUTPOINT 00000000 00000000 00000000 000001e2 2**0 CONTENTS, READONLY
35 nrv2b_8.fast 0000007c 00000000 00000000 000001e2 2**0 CONTENTS, READONLY
36 nrv2d_8.fast 00000090 00000000 00000000 0000025e 2**0 CONTENTS, READONLY
37 nrv2e_8.fast 00000098 00000000 00000000 000002ee 2**0 CONTENTS, READONLY
38 nrv2b_8.small 00000076 00000000 00000000 00000386 2**0 CONTENTS, READONLY
39 nrv2d_8.small 0000008a 00000000 00000000 000003fc 2**0 CONTENTS, READONLY
40 nrv2e_8.small 00000092 00000000 00000000 00000486 2**0 CONTENTS, READONLY
41 lzma.init 0000002e 00000000 00000000 00000518 2**0 CONTENTS, RELOC, READONLY
42 lzma.fast 000008ca 00000000 00000000 00000546 2**0 CONTENTS, RELOC, READONLY
43 lzma.small 000008ca 00000000 00000000 00000e10 2**0 CONTENTS, RELOC, READONLY
44 lzma.finish 00000012 00000000 00000000 000016da 2**0 CONTENTS, READONLY
45 reloc 0000001a 00000000 00000000 000016ec 2**0 CONTENTS, READONLY
46 loop3_set_count.b 00000002 00000000 00000000 00001706 2**0 CONTENTS, RELOC, READONLY
47 loop3_set_count.w 00000004 00000000 00000000 00001708 2**0 CONTENTS, RELOC, READONLY
48 loop3_set_count.l 00000006 00000000 00000000 0000170c 2**0 CONTENTS, RELOC, READONLY
49 jmp_stack 00000002 00000000 00000000 00001712 2**0 CONTENTS, READONLY
50 __mulsi3 0000001c 00000000 00000000 00001714 2**0 CONTENTS, READONLY
23 code_on_stack 00000000 00000000 00000000 00000118 2**0 CONTENTS, READONLY
24 clear_dirty_bss 00000000 00000000 00000000 00000118 2**0 CONTENTS, READONLY
25 loop3_label 00000000 00000000 00000000 00000118 2**0 CONTENTS, READONLY
26 loop3.small 00000002 00000000 00000000 00000118 2**0 CONTENTS, READONLY
27 loop3.fast 00000008 00000000 00000000 0000011a 2**0 CONTENTS, READONLY
28 loop3_subql 00000004 00000000 00000000 00000122 2**0 CONTENTS, RELOC, READONLY
29 loop3_subqw 00000004 00000000 00000000 00000126 2**0 CONTENTS, RELOC, READONLY
30 loop3_dbra 00000004 00000000 00000000 0000012a 2**0 CONTENTS, RELOC, READONLY
31 flush_cache 00000078 00000000 00000000 0000012e 2**0 CONTENTS, READONLY
32 restore_stack 00000004 00000000 00000000 000001a6 2**0 CONTENTS, RELOC, READONLY
33 clear_dirty_stack 0000000c 00000000 00000000 000001aa 2**0 CONTENTS, RELOC, READONLY
34 start_program 0000000c 00000000 00000000 000001b6 2**0 CONTENTS, READONLY
35 UPX1HEAD 00000020 00000000 00000000 000001c2 2**0 CONTENTS, READONLY
36 CUTPOINT 00000000 00000000 00000000 000001e2 2**0 CONTENTS, READONLY
37 nrv2b_8.fast 0000007c 00000000 00000000 000001e2 2**0 CONTENTS, READONLY
38 nrv2d_8.fast 00000090 00000000 00000000 0000025e 2**0 CONTENTS, READONLY
39 nrv2e_8.fast 00000098 00000000 00000000 000002ee 2**0 CONTENTS, READONLY
40 nrv2b_8.small 00000076 00000000 00000000 00000386 2**0 CONTENTS, READONLY
41 nrv2d_8.small 0000008a 00000000 00000000 000003fc 2**0 CONTENTS, READONLY
42 nrv2e_8.small 00000092 00000000 00000000 00000486 2**0 CONTENTS, READONLY
43 lzma.init 0000002e 00000000 00000000 00000518 2**0 CONTENTS, RELOC, READONLY
44 lzma.fast 000008ca 00000000 00000000 00000546 2**0 CONTENTS, RELOC, READONLY
45 lzma.small 000008ca 00000000 00000000 00000e10 2**0 CONTENTS, RELOC, READONLY
46 lzma.finish 00000012 00000000 00000000 000016da 2**0 CONTENTS, READONLY
47 reloc 0000001a 00000000 00000000 000016ec 2**0 CONTENTS, READONLY
48 loop3_set_count.b 00000002 00000000 00000000 00001706 2**0 CONTENTS, RELOC, READONLY
49 loop3_set_count.w 00000004 00000000 00000000 00001708 2**0 CONTENTS, RELOC, READONLY
50 loop3_set_count.l 00000006 00000000 00000000 0000170c 2**0 CONTENTS, RELOC, READONLY
51 jmp_stack 00000002 00000000 00000000 00001712 2**0 CONTENTS, READONLY
52 __mulsi3 0000001c 00000000 00000000 00001714 2**0 CONTENTS, READONLY
SYMBOL TABLE:
00000000 l d loop1_label 00000000 loop1_label
00000000 l d flush_cache 00000000 flush_cache
@ -80,12 +82,14 @@ SYMBOL TABLE:
00000000 l d jmp_decompressor_d4.w 00000000 jmp_decompressor_d4.w
00000000 l d jmp_decompressor_a6.w2 00000000 jmp_decompressor_a6.w2
00000000 l d jmp_decompressor_d4.l 00000000 jmp_decompressor_d4.l
00000000 l d clear_bss 00000000 clear_bss
00000000 l d code_on_stack 00000000 code_on_stack
00000000 l d clear_dirty_bss 00000000 clear_dirty_bss
00000000 l d loop3.small 00000000 loop3.small
00000000 l d loop3.fast 00000000 loop3.fast
00000000 l d loop3_subql 00000000 loop3_subql
00000000 l d loop3_subqw 00000000 loop3_subqw
00000000 l d loop3_dbra 00000000 loop3_dbra
00000000 l d restore_stack 00000000 restore_stack
00000000 l d clear_dirty_stack 00000000 clear_dirty_stack
00000000 l d start_program 00000000 start_program
00000000 l d UPX1HEAD 00000000 UPX1HEAD
@ -112,14 +116,14 @@ SYMBOL TABLE:
00000000 *UND* 00000000 up21_d4
00000000 *UND* 00000000 loop1_count
00000000 *UND* 00000000 loop2_count
0000000c g start_program 00000000 clear_bss_end
0000000c g start_program 00000000 code_on_stack_end
00000000 *UND* 00000000 copy_to_stack_len
00000000 *UND* 00000000 flush_cache_rts_offset
00000000 *UND* 00000000 up31_a6
00000000 *UND* 00000000 up31_d4
00000076 g flush_cache 00000000 flush_cache_rts
00000000 *UND* 00000000 clear_dirty_stack_len
0000000a g clear_dirty_stack 00000000 clear_dirty_stack_loop
00000006 g clear_dirty_stack 00000000 clear_dirty_stack_loop
00000002 g nrv2b_8.fast 00000000 nrv2b_8_fast_decompr_start
00000002 g nrv2d_8.fast 00000000 nrv2d_8_fast_decompr_start
00000002 g nrv2e_8.fast 00000000 nrv2e_8_fast_decompr_start
@ -180,7 +184,7 @@ OFFSET TYPE VALUE
RELOCATION RECORDS FOR [copy_to_stack]:
OFFSET TYPE VALUE
00000002 R_68K_PC16 clear_bss_end
00000002 R_68K_PC16 code_on_stack_end
00000007 R_68K_8 copy_to_stack_len
00000012 R_68K_16 flush_cache_rts_offset
00000015 R_68K_PC8 flush_cache+0xffffffff
@ -213,10 +217,13 @@ RELOCATION RECORDS FOR [loop3_dbra]:
OFFSET TYPE VALUE
00000002 R_68K_PC16 loop3_label
RELOCATION RECORDS FOR [restore_stack]:
OFFSET TYPE VALUE
00000002 R_68K_PC16 code_on_stack_end+0x00000004
RELOCATION RECORDS FOR [clear_dirty_stack]:
OFFSET TYPE VALUE
00000002 R_68K_PC16 clear_bss_end+0x00000004
00000005 R_68K_8 clear_dirty_stack_len
00000001 R_68K_8 clear_dirty_stack_len
RELOCATION RECORDS FOR [lzma.init]:
OFFSET TYPE VALUE