From 70cd4cbe651388897539fe38d2610e9bb733c5a8 Mon Sep 17 00:00:00 2001 From: Dimitar Dimitrov <dimitar@dinux.eu> Date: Wed, 3 Jun 2020 19:14:22 +0300 Subject: [PATCH] pru: Fix memory corruption on syscall return In the initial code I missed one level of pointer indirection. Instead of storing errno in impure_data, _impure_ptr was corrupted. Only simulator is impacted. Real targets have no OS and no syscalls. This resolves a bunch of stdio cases from the GCC testsuite: FAIL->PASS: gcc.c-torture/execute/printf-2.c -O0 execution test Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu> --- libgloss/pru/syscalls.S | 1 + 1 file changed, 1 insertion(+) diff --git a/libgloss/pru/syscalls.S b/libgloss/pru/syscalls.S index 8ed7601a4..3ad0d9215 100644 --- a/libgloss/pru/syscalls.S +++ b/libgloss/pru/syscalls.S @@ -42,6 +42,7 @@ __SC_ret: /* Invert return code and store to errno (first int in _impure_ptr). */ rsb r14, r14, 0 ldi32 r1, _impure_ptr + lbbo r1, r1, 0, 4 sbbo r14, r1, 0, 4 /* Return -1 (for both int32_t or int64_t). */ fill r14, 8