Path: blob/main/lib/libc/tests/gen/makecontext_test.c
39491 views
/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2018 John H. Baldwin <[email protected]>4*5* Redistribution and use in source and binary forms, with or without6* modification, are permitted provided that the following conditions7* are met:8* 1. Redistributions of source code must retain the above copyright9* notice, this list of conditions and the following disclaimer.10* 2. Redistributions in binary form must reproduce the above copyright11* notice, this list of conditions and the following disclaimer in the12* documentation and/or other materials provided with the distribution.13*14* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND15* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE16* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE17* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE18* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL19* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS20* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)21* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT22* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY23* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF24* SUCH DAMAGE.25*/2627#include <atf-c.h>28#include <ucontext.h>2930static char uc_stack[16 * 1024];3132static void33check_1(int arg1)34{3536ATF_REQUIRE_EQ(arg1, 1);37}3839ATF_TC_WITHOUT_HEAD(makecontext_arg1);40ATF_TC_BODY(makecontext_arg1, tc)41{42ucontext_t ctx[2];4344ATF_REQUIRE_EQ(getcontext(&ctx[1]), 0);45ctx[1].uc_stack.ss_sp = uc_stack;46ctx[1].uc_stack.ss_size = sizeof(uc_stack);47ctx[1].uc_link = &ctx[0];48makecontext(&ctx[1], (void (*)(void))check_1, 1, 1);4950ATF_REQUIRE_EQ(swapcontext(&ctx[0], &ctx[1]), 0);51}5253static void54check_2(int arg1, int arg2)55{5657ATF_REQUIRE_EQ(arg1, 1);58ATF_REQUIRE_EQ(arg2, 2);59}6061ATF_TC_WITHOUT_HEAD(makecontext_arg2);62ATF_TC_BODY(makecontext_arg2, tc)63{64ucontext_t ctx[2];6566ATF_REQUIRE_EQ(getcontext(&ctx[1]), 0);67ctx[1].uc_stack.ss_sp = uc_stack;68ctx[1].uc_stack.ss_size = sizeof(uc_stack);69ctx[1].uc_link = &ctx[0];70makecontext(&ctx[1], (void (*)(void))check_2, 2, 1, 2);7172ATF_REQUIRE_EQ(swapcontext(&ctx[0], &ctx[1]), 0);73}7475static void76check_3(int arg1, int arg2, int arg3)77{7879ATF_REQUIRE_EQ(arg1, 1);80ATF_REQUIRE_EQ(arg2, 2);81ATF_REQUIRE_EQ(arg3, 3);82}8384ATF_TC_WITHOUT_HEAD(makecontext_arg3);85ATF_TC_BODY(makecontext_arg3, tc)86{87ucontext_t ctx[2];8889ATF_REQUIRE_EQ(getcontext(&ctx[1]), 0);90ctx[1].uc_stack.ss_sp = uc_stack;91ctx[1].uc_stack.ss_size = sizeof(uc_stack);92ctx[1].uc_link = &ctx[0];93makecontext(&ctx[1], (void (*)(void))check_3, 3, 1, 2, 3);9495ATF_REQUIRE_EQ(swapcontext(&ctx[0], &ctx[1]), 0);96}9798static void99check_4(int arg1, int arg2, int arg3, int arg4)100{101102ATF_REQUIRE_EQ(arg1, 1);103ATF_REQUIRE_EQ(arg2, 2);104ATF_REQUIRE_EQ(arg3, 3);105ATF_REQUIRE_EQ(arg4, 4);106}107108ATF_TC_WITHOUT_HEAD(makecontext_arg4);109ATF_TC_BODY(makecontext_arg4, tc)110{111ucontext_t ctx[2];112113ATF_REQUIRE_EQ(getcontext(&ctx[1]), 0);114ctx[1].uc_stack.ss_sp = uc_stack;115ctx[1].uc_stack.ss_size = sizeof(uc_stack);116ctx[1].uc_link = &ctx[0];117makecontext(&ctx[1], (void (*)(void))check_4, 4, 1, 2, 3, 4);118119ATF_REQUIRE_EQ(swapcontext(&ctx[0], &ctx[1]), 0);120}121122static void123check_5(int arg1, int arg2, int arg3, int arg4, int arg5)124{125126ATF_REQUIRE_EQ(arg1, 1);127ATF_REQUIRE_EQ(arg2, 2);128ATF_REQUIRE_EQ(arg3, 3);129ATF_REQUIRE_EQ(arg4, 4);130ATF_REQUIRE_EQ(arg5, 5);131}132133ATF_TC_WITHOUT_HEAD(makecontext_arg5);134ATF_TC_BODY(makecontext_arg5, tc)135{136ucontext_t ctx[2];137138ATF_REQUIRE_EQ(getcontext(&ctx[1]), 0);139ctx[1].uc_stack.ss_sp = uc_stack;140ctx[1].uc_stack.ss_size = sizeof(uc_stack);141ctx[1].uc_link = &ctx[0];142makecontext(&ctx[1], (void (*)(void))check_5, 5, 1, 2, 3, 4, 5);143144ATF_REQUIRE_EQ(swapcontext(&ctx[0], &ctx[1]), 0);145}146147static void148check_6(int arg1, int arg2, int arg3, int arg4, int arg5, int arg6)149{150151ATF_REQUIRE_EQ(arg1, 1);152ATF_REQUIRE_EQ(arg2, 2);153ATF_REQUIRE_EQ(arg3, 3);154ATF_REQUIRE_EQ(arg4, 4);155ATF_REQUIRE_EQ(arg5, 5);156ATF_REQUIRE_EQ(arg6, 6);157}158159ATF_TC_WITHOUT_HEAD(makecontext_arg6);160ATF_TC_BODY(makecontext_arg6, tc)161{162ucontext_t ctx[2];163164ATF_REQUIRE_EQ(getcontext(&ctx[1]), 0);165ctx[1].uc_stack.ss_sp = uc_stack;166ctx[1].uc_stack.ss_size = sizeof(uc_stack);167ctx[1].uc_link = &ctx[0];168makecontext(&ctx[1], (void (*)(void))check_6, 6, 1, 2, 3, 4, 5, 6);169170ATF_REQUIRE_EQ(swapcontext(&ctx[0], &ctx[1]), 0);171}172173ATF_TP_ADD_TCS(tp)174{175176ATF_TP_ADD_TC(tp, makecontext_arg1);177ATF_TP_ADD_TC(tp, makecontext_arg2);178ATF_TP_ADD_TC(tp, makecontext_arg3);179ATF_TP_ADD_TC(tp, makecontext_arg4);180ATF_TP_ADD_TC(tp, makecontext_arg5);181ATF_TP_ADD_TC(tp, makecontext_arg6);182183return (atf_no_error());184}185186187