Path: blob/master/tools/testing/selftests/arm64/gcs/gcspushm.S
26292 views
// SPDX-License-Identifier: GPL-2.0-only1//2// Copyright 2024 Arm Limited3//4// Give ourselves GCS push 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 KSFT_SKIP 41819.macro function name20.macro endfunction21.type \name, @function22.purgem endfunction23.endm24\name:25.endm2627// Print a single character x0 to stdout28// Clobbers x0-x2,x829function putc30str x0, [sp, #-16]!3132mov x0, #1 // STDOUT_FILENO33mov x1, sp34mov x2, #135mov x8, #__NR_write36svc #03738add sp, sp, #1639ret40endfunction41.globl putc4243// Print a NUL-terminated string starting at address x0 to stdout44// Clobbers x0-x3,x845function puts46mov x1, x04748mov x2, #0490: ldrb w3, [x0], #150cbz w3, 1f51add x2, x2, #152b 0b53541: mov w0, #1 // STDOUT_FILENO55mov x8, #__NR_write56svc #05758ret59endfunction60.globl puts6162// Utility macro to print a literal string63// Clobbers x0-x4,x864.macro puts string65.pushsection .rodata.str1.1, "aMS", @progbits, 166.L__puts_literal\@: .string "\string"67.popsection6869ldr x0, =.L__puts_literal\@70bl puts71.endm7273.globl _start74function _start75// Run with GCS76mov x0, PR_SET_SHADOW_STACK_STATUS77mov x1, PR_SHADOW_STACK_ENABLE | PR_SHADOW_STACK_PUSH78mov x2, xzr79mov x3, xzr80mov x4, xzr81mov x5, xzr82mov x8, #__NR_prctl83svc #084cbz x0, 1f85puts "Failed to enable GCS with push permission\n"86mov x0, #KSFT_SKIP87b 2f881:89sys #3, c7, c7, #0, x0 // GCSPUSHM90sysl x0, #3, c7, c7, #1 // GCSPOPM9192mov x0, #0932:94mov x8, #__NR_exit95svc #0969798