/* $NetBSD: linux32_sigcode.S,v 1.1 2021/11/25 03:08:04 ryo Exp $ */
/*-
* Copyright (c) 2021 Ryo Shimizu <ryo@nerv.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <machine/asm.h>
RCSID("$NetBSD: linux32_sigcode.S,v 1.1 2021/11/25 03:08:04 ryo Exp $")
#include <compat/linux32/linux32_syscall.h>
/*
* linux aarch32 Signal trampoline code
*/
.text
.section .rodata
.align 12
.global _C_LABEL(linux32_sigcode)
_C_LABEL(linux32_sigcode):
/* mov r7, #LINUX32_SYS_sigreturn */
.word 0xe3a07000 + LINUX32_SYS_sigreturn
.word 0xef000000 /* svc 0 */
/* NOTREACHED */
.word 0xe7f000f0 /* udf #0 */
.global _C_LABEL(linux32_rt_sigcode)
_C_LABEL(linux32_rt_sigcode):
/* mov r7, #LINUX32_SYS_rt_sigreturn */
.word 0xe3a07000 + LINUX32_SYS_rt_sigreturn
.word 0xef000000 /* svc 0 */
/* NOTREACHED */
.word 0xe7f000f0 /* udf #0 */
/*
* linux/arm kuser_helper
* - should be mapped on userspace vaddr 0xffff0f60
* - https://www.kernel.org/doc/Documentation/arm/kernel_user_helpers.txt
*/
.kuser_helper_pad:
#define KUSER_HELPER_START 0x00000f60
.space KUSER_HELPER_START - (.kuser_helper_pad - _C_LABEL(linux32_sigcode))
/*
* 0xffff0f60
* int __kuser_cmpxchg64(const int64_t *oldval, const int64_t *newval, volatile int64_t *ptr);
*/
.__kuser_cmpxchg64:
.word 0xe92d00f0 /* push {r4, r5, r6, r7} */
.word 0xf57ff05f /* dmb sy */
.word 0xe1c040d0 /* ldrd r4, [r0] */
.word 0xe1c160d0 /* ldrd r6, [r1] */
.word 0xe1b20f9f /* ldrexd r0, [r2] */
.word 0xe0500004 /* subs r0, r0, r4 */
.word 0xe0c11005 /* sbc r1, r1, r5 */
.word 0xe1900001 /* orrs r0, r0, r1 */
.word 0x01a20f96 /* strexdeq r0, r6, [r2] */
.word 0xf57ff05f /* dmb sy */
.word 0xe8bd00f0 /* pop {r4, r5, r6, r7} */
.word 0xe12fff1e /* bx lr */
.align 5
/*
* 0xffff0fa0
* void __kuser_memory_barrier(void);
*/
.__kuser_memory_barrier:
.word 0xf57ff05f /* dmb sy */
.word 0xe12fff1e /* bx lr */
.align 5
/*
* 0xffff0fc0
* int __kuser_cmpxchg(int32_t oldval, int32_t newval, volatile int32_t *ptr);
*/
.__kuser_cmpxchg:
.word 0xf57ff05f /* dmb sy */
.word 0xe1923f9f /* ldrex r3, [r2] */
.word 0xe0530000 /* subs r0, r3, r0 */
.word 0x01820f91 /* strexeq r0, r1, [r2] */
.word 0xf57ff05f /* dmb sy */
.word 0xe12fff1e /* bx lr */
.align 5
/* 0xffff0fe0 */
.__kuser_get_tls:
.word 0xee1d0f70 /* mrc p15, 0, r0, c13, c0, 3 */
.word 0xe12fff1e /* bx lr */
.align 4
/* 0xffff0ff0 */
.word 0
/* 0xffff0ff4 */
.word 0
/* 0xffff0ff8 */
.word 0
/* 0xffff0ffc */
.__kuser_helper_version:
.word 2
.global _C_LABEL(linux32_esigcode)
_C_LABEL(linux32_esigcode):