Path: blob/main/tests/sys/compat32/aarch64/swp_cond_test_impl.S
39566 views
/*1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2021 Warner Losh4* Copyright (c) 2023 Stormshield5* Copyright (c) 2023 Klara, Inc.6*/78#include <sys/syscall.h>910#define STDOUT_FILENO 111#define SWP_MAGIC 0xffc012#define SWPB_MAGIC 0xc0c01314.text15.file "swp_test.S"16.syntax unified17.globl main18.p2align 219.type main,%function20.code 322122main:23sub sp, #0x0424/* r4 is our failed test counter */25mov r4, #026/* r6 is our current teset counter */27mov r6, #12829movw r0, :lower16:.L.testheader30movt r0, :upper16:.L.testheader31ldr r1, =(.L.testheaderEnd - .L.testheader - 1)32bl print3334/* eq */35bl reset36mov r1, #SWP_MAGIC37cmp r1, r138swpeq r0, r1, [r0]39bl expect_success4041/* Returned 0 (bad) or 1 (ok) */42cmp r0, #043beq 1f4445/* !eq */46bl reset47mov r1, #SWP_MAGIC48mov r2, #049cmp r1, r250swpeq r0, r1, [r0]51bl expect_fail5253/* Don't care about the return of the second one, just print */541:55movw r0, :lower16:.L.eq56movt r0, :upper16:.L.eq57ldr r1, =(.L.eqEnd - .L.eq - 1)58bl print_result59add r6, r6, #1 /* Next test */6061/* cs */62bl reset63mov r1, #SWP_MAGIC64movw r3, #0xffff65movt r3, #0xffff66/* Overflow */67adds r2, r3, r368swpcs r0, r1, [r0]69bl expect_success7071/* Returned 0 (bad) or 1 (ok) */72cmp r0, #073beq 2f7475/* !cs */76bl reset77mov r1, #SWP_MAGIC78mov r3, #0x0079adds r2, r3, #0x0880swpcs r0, r1, [r0]81bl expect_fail8283/* Don't care about the return of the second one, just print */842:85movw r0, :lower16:.L.cs86movt r0, :upper16:.L.cs87ldr r1, =(.L.csEnd - .L.cs - 1)88bl print_result89add r6, r6, #1 /* Next test */9091/* mi */92bl reset93mov r1, #SWP_MAGIC94mov r2, #095/* Underflow */96subs r2, r2, #0x0597swpmi r0, r1, [r0]98bl expect_success99100/* Returned 0 (bad) or 1 (ok) */101cmp r0, #0102beq 3f103104/* !mi */105bl reset106mov r1, #SWP_MAGIC107mov r2, #0x10108subs r2, r2, #0x08109swpmi r0, r1, [r0]110bl expect_fail111112/* Don't care about the return of the second one, just print */1133:114movw r0, :lower16:.L.mi115movt r0, :upper16:.L.mi116ldr r1, =(.L.miEnd - .L.mi - 1)117bl print_result118add r6, r6, #1 /* Next test */119120/* vs */121bl reset122mov r1, #SWP_MAGIC123movw r3, #0xffff124movt r3, #0x7fff125/* Overflow */126adds r2, r3, #0x10127swpvs r0, r1, [r0]128bl expect_success129130/* Returned 0 (bad) or 1 (ok) */131cmp r0, #0132beq 4f133134/* !vs */135bl reset136mov r1, #SWP_MAGIC137mov r3, #0x00138adds r2, r3, #0x08139swpvs r0, r1, [r0]140bl expect_fail141142/* Don't care about the return of the second one, just print */1434:144movw r0, :lower16:.L.vs145movt r0, :upper16:.L.vs146ldr r1, =(.L.vsEnd - .L.vs - 1)147bl print_result148add r6, r6, #1 /* Next test */149150/* hi */151bl reset152mov r1, #SWP_MAGIC153mov r2, #0x00154mov r3, #0x01155cmp r3, r2156swphi r0, r1, [r0]157bl expect_success158159/* Returned 0 (bad) or 1 (ok) */160cmp r0, #0161beq 5f162163/* !hi */164bl reset165mov r1, #SWP_MAGIC166mov r2, #0x00167mov r3, #0x01168cmp r2, r3169swphi r0, r1, [r0]170bl expect_fail171172/* Don't care about the return of the second one, just print */1735:174movw r0, :lower16:.L.hi175movt r0, :upper16:.L.hi176ldr r1, =(.L.hiEnd - .L.hi - 1)177bl print_result178add r6, r6, #1 /* Next test */179180/* ge */181bl reset182mov r1, #SWP_MAGIC183mov r2, #0x01184cmp r2, r2185swpge r0, r1, [r0]186bl expect_success187188/* Returned 0 (bad) or 1 (ok) */189cmp r0, #0190beq 6f191192/* !ge */193bl reset194mov r1, #SWP_MAGIC195mov r2, #0x00196mov r3, #0x01197cmp r2, r3198swpge r0, r1, [r0]199bl expect_fail200201/* Don't care about the return of the second one, just print */2026:203movw r0, :lower16:.L.ge204movt r0, :upper16:.L.ge205ldr r1, =(.L.geEnd - .L.ge - 1)206bl print_result207add r6, r6, #1 /* Next test */208209/* gt */210bl reset211mov r1, #SWP_MAGIC212mov r2, #0x00213mov r3, #0x01214cmp r3, r2215swpgt r0, r1, [r0]216bl expect_success217218/* Returned 0 (bad) or 1 (ok) */219cmp r0, #0220beq 7f221222/* !ge */223bl reset224mov r1, #SWP_MAGIC225mov r2, #0x00226mov r3, #0x01227cmp r2, r3228swpgt r0, r1, [r0]229bl expect_fail230231/* Don't care about the return of the second one, just print */2327:233movw r0, :lower16:.L.gt234movt r0, :upper16:.L.gt235ldr r1, =(.L.gtEnd - .L.gt - 1)236bl print_result237add r6, r6, #1 /* Next test */238239mov r0, r4 /* retval */240ldr r7, =SYS_exit241swi 0242243.p2align 2244.type print_result,%function245.code 32246print_result:247push {r4, r5, lr}248/* Save the label, size for our result */249mov r4, r0250mov r5, r1251252movw r0, :lower16:.L.ok253movt r0, :upper16:.L.ok254ldr r1, =(.L.okEnd - .L.ok - 1)255bl print256mov r0, r6257add r0, #0x30 /* "0" + test number */258mov r1, #0x01259str r0, [sp]260mov r0, sp261bl print262movw r0, :lower16:.L.swp263movt r0, :upper16:.L.swp264ldr r1, =(.L.swpEnd - .L.swp - 1)265bl print266mov r0, r4267mov r1, r5268bl print269movw r0, :lower16:.L.term270movt r0, :upper16:.L.term271ldr r1, =(.L.termEnd - .L.term - 1)272bl print273274pop {r4, r5, lr}275bx lr276277.p2align 2278.type reset,%function279.code 32280reset:281/* Reset sp[0] and return the address used */282mov r0, #0x03283str r0, [sp]284mov r0, sp285bx lr286287.p2align 2288.type expect_fail,%function289.code 32290expect_fail:291/* Just check the stack value */292ldr r0, [sp]293mov r1, #0x03294cmp r0, r1295bne 1f296297/* Success (not swapped) */298mov r0, #1299bx lr3003011:302/* Fail (swapped) */303/* Print the "not" part */304movw r0, :lower16:.L.not305movt r0, :upper16:.L.not306ldr r1, =(.L.notEnd - .L.not - 1)307push {lr}308bl print309pop {lr}310311/* Failed */312add r4, r4, #1313mov r0, #0314bx lr315316.p2align 2317.type expect_success,%function318.code 32319expect_success:320/* Old value should be 3 */321cmp r0, #0x03322beq 1f323b 3f3243251:326/* Check stack value */327ldr r0, [sp]328mov r1, #SWP_MAGIC329cmp r0, r1330beq 2f331b 3f3323332:334mov r0, #1335bx lr3363373:338/* Print the "not" part */339movw r0, :lower16:.L.not340movt r0, :upper16:.L.not341ldr r1, =(.L.notEnd - .L.not - 1)342push {lr}343bl print344pop {lr}345346/* Failed */347add r4, r4, #1348mov r0, #0349bx lr350351.p2align 2352.type print,%function353.code 32354print:355/* r0 - string, r1 = size */356mov r2, r1357mov r1, r0358ldr r0, =STDOUT_FILENO359ldr r7, =SYS_write360swi 0361362bx lr363364.L.testheader:365.asciz "1..7\n"366.L.testheaderEnd:367.size .L.testheader, .L.testheaderEnd - .L.testheader368369.L.not:370.asciz "not "371.L.notEnd:372.size .L.not, .L.notEnd - .L.not373.L.ok:374.asciz "ok "375.L.okEnd:376.size .L.ok, .L.okEnd - .L.ok377.L.swp:378.asciz " - swp"379.L.swpEnd:380.size .L.swp, .L.swpEnd - .L.swp381.L.eq:382.asciz "eq"383.L.eqEnd:384.size .L.eq, .L.eqEnd - .L.eq385.L.cs:386.asciz "cs"387.L.csEnd:388.size .L.cs, .L.csEnd - .L.cs389.L.mi:390.asciz "mi"391.L.miEnd:392.size .L.mi, .L.miEnd - .L.mi393.L.vs:394.asciz "vs"395.L.vsEnd:396.size .L.vs, .L.vsEnd - .L.vs397.L.hi:398.asciz "hi"399.L.hiEnd:400.size .L.hi, .L.hiEnd - .L.hi401.L.ge:402.asciz "ge"403.L.geEnd:404.size .L.ge, .L.geEnd - .L.ge405.L.gt:406.asciz "gt"407.L.gtEnd:408.size .L.gt, .L.gtEnd - .L.gt409.L.term:410.asciz "\n"411.L.termEnd:412.size .L.term, .L.termEnd - .L.term413414415