From 07b49497dbd0bbb068ce70a1d5d38e313cae0d1a Mon Sep 17 00:00:00 2001 From: Alexander Kabaev Date: Fri, 7 Apr 2017 22:58:20 +0000 Subject: [PATCH] Do not use b.cs instruction to jump to cerror. The conditional jump can only be performed to targets up to 1MB in either direction and does not work too well when linker places cerror further that that from the caller. In that case linker will complain about relocation overflows. Reviewed by: emaste, andrew Differential Revision: https://reviews.freebsd.org/D10305 --- lib/libc/aarch64/SYS.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/libc/aarch64/SYS.h b/lib/libc/aarch64/SYS.h index e0be59d3cddb..2cefc8c123d6 100644 --- a/lib/libc/aarch64/SYS.h +++ b/lib/libc/aarch64/SYS.h @@ -45,12 +45,19 @@ ENTRY(__sys_##name); \ ret; \ END(__sys_##name) +/* + * Conditional jumps can only go up to one megabyte in either + * direction, and cerror can be located anywhere, so we have + * to jump around to use more capable unconditional branch + * instruction. + */ #define PSEUDO(name) \ ENTRY(__sys_##name); \ WEAK_REFERENCE(__sys_##name, _##name); \ _SYSCALL(name); \ - b.cs cerror; \ + b.cs 1f; \ ret; \ +1: b cerror; \ END(__sys_##name) #define RSYSCALL(name) \ @@ -58,6 +65,7 @@ ENTRY(__sys_##name); \ WEAK_REFERENCE(__sys_##name, name); \ WEAK_REFERENCE(__sys_##name, _##name); \ _SYSCALL(name); \ - b.cs cerror; \ + b.cs 1f; \ ret; \ +1: b cerror; \ END(__sys_##name)