From mboxrd@z Thu Jan 1 00:00:00 1970 From: Leif Lindholm Date: Wed, 08 Aug 2012 10:44:46 +0100 Subject: [U-Boot] [PATCH] Save/restore global data pointer on API boundary In-Reply-To: <20120807183021.B52BD204016@gemini.denx.de> References: <50214A38.3000305@arm.com> <20120807183021.B52BD204016@gemini.denx.de> Message-ID: <5022350E.4050509@arm.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 08/07/12 19:30, Wolfgang Denk wrote: >> Most architectures keep the global data pointer (gd) in a register. > > This may, or may not be. You should not make any assumptions on how > gd is implemented. The comment did, the code didn't, as long as gd was a pointer (which should be a safe assumption). But that's irrelevant as I seem to have gotten the wrong end of the stick. >> When using the external app API, because they are calling us rather >> than we calling them, this register can be corrupted. > > How can this be? The caller should always use the same register > convention as we do - otherwise we are in a much deeper trouble. > It is up to the caller to make sure it uses the published API (resp. > ABI). Hmm, ok - this was not clear to me from the docs and example. Indeed, the example does not reserve r8 (on ARM) or r2 (on PPC). Nor does it save/restore it on entry/syscall. I don't know the exact ABI semantics of r2 for PPC, but on ARM this is an error. This could be worked around by something like: diff --git a/examples/api/crt0.S b/examples/api/crt0.S index 6daf127..5f956e4 100644 --- a/examples/api/crt0.S +++ b/examples/api/crt0.S @@ -49,13 +49,21 @@ syscall: _start: ldr ip, =search_hint str sp, [ip] + ldr ip, =gd_backup + str r8, [ip] b main .globl syscall syscall: + push {r6-r8, lr} + ldr r6, =gd_backup + ldr r8, [r6] ldr ip, =syscall_ptr + mov lr, pc ldr pc, [ip] + str r8, [r6] + pop {r6-r8, pc} #else #error No support for this arch! @@ -69,3 +77,7 @@ syscall_ptr: .globl search_hint search_hint: .long 0 + + .globl gd_backup +gd_backup: + .long 0 An alternative would be to mandate DECLARE_GLOBAL_DATA_PTR for all API applications, but I'd frankly prefer not providing direct access to gd. Best Regards, Leif