1f08c3bdfSopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 2f08c3bdfSopenharmony_ci/* 3f08c3bdfSopenharmony_ci * Copyright (c) Linux Test Project, 2020 4f08c3bdfSopenharmony_ci * Copyright (c) Wipro Technologies Ltd, 2002 5f08c3bdfSopenharmony_ci */ 6f08c3bdfSopenharmony_ci 7f08c3bdfSopenharmony_ci/* 8f08c3bdfSopenharmony_ci * This is a basic test for iopl(2) system call. 9f08c3bdfSopenharmony_ci * 10f08c3bdfSopenharmony_ci * Test the system call for possible privelege levels. 11f08c3bdfSopenharmony_ci * As the privelge level for a normal process is 0, start by 12f08c3bdfSopenharmony_ci * setting/changing the level to 0. 13f08c3bdfSopenharmony_ci * 14f08c3bdfSopenharmony_ci * Author: Subhab Biswas <subhabrata.biswas@wipro.com> 15f08c3bdfSopenharmony_ci */ 16f08c3bdfSopenharmony_ci 17f08c3bdfSopenharmony_ci#include <errno.h> 18f08c3bdfSopenharmony_ci#include <unistd.h> 19f08c3bdfSopenharmony_ci 20f08c3bdfSopenharmony_ci#include "tst_test.h" 21f08c3bdfSopenharmony_ci 22f08c3bdfSopenharmony_ci#if defined __i386__ || defined(__x86_64__) 23f08c3bdfSopenharmony_ci#include <sys/io.h> 24f08c3bdfSopenharmony_ci 25f08c3bdfSopenharmony_cistatic void verify_iopl(void) 26f08c3bdfSopenharmony_ci{ 27f08c3bdfSopenharmony_ci int total_level = 4; 28f08c3bdfSopenharmony_ci int level; 29f08c3bdfSopenharmony_ci 30f08c3bdfSopenharmony_ci for (level = 0; level < total_level; ++level) { 31f08c3bdfSopenharmony_ci 32f08c3bdfSopenharmony_ci TEST(iopl(level)); 33f08c3bdfSopenharmony_ci 34f08c3bdfSopenharmony_ci if (TST_RET == -1) { 35f08c3bdfSopenharmony_ci tst_res(TFAIL | TTERRNO, "iopl() failed for level %d, " 36f08c3bdfSopenharmony_ci "errno=%d : %s", level, 37f08c3bdfSopenharmony_ci TST_ERR, tst_strerrno(TST_ERR)); 38f08c3bdfSopenharmony_ci } else { 39f08c3bdfSopenharmony_ci tst_res(TPASS, "iopl() passed for level %d, " 40f08c3bdfSopenharmony_ci "returned %ld", level, TST_RET); 41f08c3bdfSopenharmony_ci } 42f08c3bdfSopenharmony_ci } 43f08c3bdfSopenharmony_ci} 44f08c3bdfSopenharmony_ci 45f08c3bdfSopenharmony_cistatic void cleanup(void) 46f08c3bdfSopenharmony_ci{ 47f08c3bdfSopenharmony_ci /* 48f08c3bdfSopenharmony_ci * back to I/O privilege for normal process. 49f08c3bdfSopenharmony_ci */ 50f08c3bdfSopenharmony_ci if (iopl(0) == -1) 51f08c3bdfSopenharmony_ci tst_res(TWARN, "iopl() cleanup failed"); 52f08c3bdfSopenharmony_ci} 53f08c3bdfSopenharmony_ci 54f08c3bdfSopenharmony_cistatic struct tst_test test = { 55f08c3bdfSopenharmony_ci .test_all = verify_iopl, 56f08c3bdfSopenharmony_ci .needs_root = 1, 57f08c3bdfSopenharmony_ci /* iopl() is restricted under kernel lockdown. */ 58f08c3bdfSopenharmony_ci .skip_in_lockdown = 1, 59f08c3bdfSopenharmony_ci .cleanup = cleanup, 60f08c3bdfSopenharmony_ci}; 61f08c3bdfSopenharmony_ci 62f08c3bdfSopenharmony_ci#else 63f08c3bdfSopenharmony_ciTST_TEST_TCONF("LSB v1.3 does not specify iopl() for this architecture. (only for i386 or x86_64)"); 64f08c3bdfSopenharmony_ci#endif /* __i386_, __x86_64__*/ 65