diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2014-12-30 18:31:22 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2014-12-30 18:31:22 +0000 |
commit | 08e9934e5378555bc60ace0d2f569fc3845624aa (patch) | |
tree | 709ec26d17d8d3e313794f8be9e07491e79eae52 /libexec/ld.so | |
parent | e104fae1b63988941f375c10fc35f41fcddd5102 (diff) |
Clean up and optimize _dl_start a bit by using immediate addressing for
the constants whenever they fit, and avoiding saving and restoring
registers we don't need to preserve.
Diffstat (limited to 'libexec/ld.so')
-rw-r--r-- | libexec/ld.so/sh/ldasm.S | 52 |
1 files changed, 17 insertions, 35 deletions
diff --git a/libexec/ld.so/sh/ldasm.S b/libexec/ld.so/sh/ldasm.S index fed5cabae0e..c258229a14a 100644 --- a/libexec/ld.so/sh/ldasm.S +++ b/libexec/ld.so/sh/ldasm.S @@ -1,4 +1,4 @@ -/* $OpenBSD: ldasm.S,v 1.17 2014/07/14 03:54:51 deraadt Exp $ */ +/* $OpenBSD: ldasm.S,v 1.18 2014/12/30 18:31:21 miod Exp $ */ /* * Copyright (c) 2006 Dale Rahn @@ -32,59 +32,45 @@ #include <SYS.h> ENTRY(_dl_start) - mov r15, r12 // save for later - sts pr, r11 - mov r15, r4 // boot_bind(sp, dl_data) (sp) - mov.l .L_datasize, r0 - sub r0, r15 - mov r15, r5 - mov r5, r13 - // not trusting register to store the data, push it on the stack. - // callee/caller save questions - - mov r15, r14 - + mov r15, r12 // save for later + mov r15, r4 // sp + add #-(4+4+DL_DATA_SIZE), r15 + mov r15, r5 // dl_data bsr 1f nop 1: .L_offbase: sts pr, r0 mov.l .L_dynamic, r6 - add r0, r6 - mov r14, r15 - mov r15, r14 + add r0, r6 // DYNAMIC mov.l .L_boot_bind, r0 - bsrf r0 + bsrf r0 // boot_bind(sp, dl_data, DYNAMIC) nop .L_call_boot_bind: mov r12, r4 - add #4, r4 - mov.l @r12, r5 //loads argc + add #4, r4 // argv + mov.l @r12, r5 add #2, r5 shll2 r5 - add r12, r5 // calc argv - - mov r13, r7 + add r12, r5 // envp + mov r15, r7 // dl_data mov r7, r6 - mov.l .L_loff, r0 - add r0, r6 - mov.l @r6, r6 + add #(7*4), r6 + mov.l @r6, r6 // dl_data[AUX_base] == loff mov.l .L_boot, r0 - bsrf r0 + bsrf r0 // _dl_boot(argv, envp, loff, dl_data) nop .L_call_boot: - mov r12, r15 - lds r11, pr - mov.l @r15, r4 + mov.l @r15, r4 // argc mov r15, r5 - add #4, r5 + add #4, r5 // argv mov r4, r6 add #1, r6 shll2 r6 - add r5, r6 // calc envp + add r5, r6 // envp mov r0, r12 mova .L_GOT, r0 @@ -99,12 +85,8 @@ ENTRY(_dl_start) .long _dl_boot_bind-.L_call_boot_bind .L_boot: .long _dl_boot-.L_call_boot -.L_datasize: - .long 4+4+DL_DATA_SIZE .L_dynamic: .long _DYNAMIC-.L_offbase -.L_loff: - .long 7*4 .L_GOT: .long _GLOBAL_OFFSET_TABLE_ .L_dl_dtors: |