Path: blob/master/tools/testing/selftests/arm64/gcs/gcsstr.S
26295 views
// SPDX-License-Identifier: GPL-2.0-only1//2// Copyright 2024 Arm Limited3//4// Give ourselves GCS write permissions then use them56#include <asm/unistd.h>78/* Shadow Stack/Guarded Control Stack interface */9#define PR_GET_SHADOW_STACK_STATUS 7410#define PR_SET_SHADOW_STACK_STATUS 7511#define PR_LOCK_SHADOW_STACK_STATUS 761213# define PR_SHADOW_STACK_ENABLE (1UL << 0)14# define PR_SHADOW_STACK_WRITE (1UL << 1)15# define PR_SHADOW_STACK_PUSH (1UL << 2)1617#define GCSPR_EL0 S3_3_C2_C5_11819#define KSFT_SKIP 42021.macro function name22.macro endfunction23.type \name, @function24.purgem endfunction25.endm26\name:27.endm2829// Print a single character x0 to stdout30// Clobbers x0-x2,x831function putc32str x0, [sp, #-16]!3334mov x0, #1 // STDOUT_FILENO35mov x1, sp36mov x2, #137mov x8, #__NR_write38svc #03940add sp, sp, #1641ret42endfunction43.globl putc4445// Print a NUL-terminated string starting at address x0 to stdout46// Clobbers x0-x3,x847function puts48mov x1, x04950mov x2, #0510: ldrb w3, [x0], #152cbz w3, 1f53add x2, x2, #154b 0b55561: mov w0, #1 // STDOUT_FILENO57mov x8, #__NR_write58svc #05960ret61endfunction62.globl puts6364// Utility macro to print a literal string65// Clobbers x0-x4,x866.macro puts string67.pushsection .rodata.str1.1, "aMS", @progbits, 168.L__puts_literal\@: .string "\string"69.popsection7071ldr x0, =.L__puts_literal\@72bl puts73.endm7475.globl _start76function _start77// Run with GCS78mov x0, PR_SET_SHADOW_STACK_STATUS79mov x1, PR_SHADOW_STACK_ENABLE | PR_SHADOW_STACK_WRITE80mov x2, xzr81mov x3, xzr82mov x4, xzr83mov x5, xzr84mov x8, #__NR_prctl85svc #086cbz x0, 1f87puts "Failed to enable GCS with write permission\n"88mov x0, #KSFT_SKIP89b 2f901:91mrs x0, GCSPR_EL092sub x0, x0, #893.inst 0xd91f1c01 // GCSSTR x1, x09495mov x0, #0962:97mov x8, #__NR_exit98svc #099100101