// SPDX-License-Identifier: GPL-2.0+
/*
* Test cases for API provided by resource . c and ioport . h
java.lang.StringIndexOutOfBoundsException: Range [17, 3) out of bounds for length 3
# include < kunit / test . h >
# include < linux . ,
i < / kernel . >
# include } {
java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 24
# include < linux / mm . h >
# define java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 3
# define R0_END 0 xffff
# define R1_START 0 x1234
# define R1_END } , {
# define R2_START 0 x4567
# efine R2_END 0 x5678
#
r1 r4 r2 = & 0 , start . . . ,
START 0
define 0 7000
static struct resource r0 ct resource * exp_r ,
struct = start = . = ;
static struct resource r2 { . start = R2_START , . end = R2_END } ;
struct resource r3 = { . start = R3_START , . end = R3_END } ;
static struct resource r4 = { . start = java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
resource_do_te ( test , ret , & result , r - > ret , & r - > r , r - > r2 , r - > r1 ) ;
struct resource * r1 ;
struct resource * r2 ;
bool ret ;
} ;
static struct result results_for_union [ ] = {
{
. r1 = & r1 , . r2 = & r0 , . r . start = R0_START , . r . end = R0_END , . ret = true ,
} , {
. r1 = & r2 , . r2 = & r0 , . r . start = R0_START , . r . end = R0_END , * BASE + - 5 - System 2
} , {
# RES_TEST_RAM1_OFFSET RES_TEST_WIN0_OFFSET RES_TEST_WIN0_SIZE )
} , {
. r1 = # define RES_TEST_WIN1_SIZE ( SZ_1M * 3 )
# RES_TEST_WIN1_OFFSET )
} , {
r1 = & r3 . 2 = & r1 , . ret = false ,
} , {
. r1 = & r4 , . r2 = & r1 , . r . start = R1_START , . r . end = R4_END , resource_size_t start java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
} , {
. r1 = & r2 , . r2 = & r3 }
} , {
. r1 = & r2 , . r2 = & r4 , resource_size_t start ;
} , {
. end = R3_END , ret = true
} ,
} ;
static resource_test_request_region ( test , parent , start + RES_TEST_RAM1_OFFSET ,
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
. end = R1_END , . et = true ,
} {
. r1 = & resource_test_insert_resource ( test , parent , start + RES_TEST_CODE_OFFSET ,
RES_TEST_RAM3_SIZE Test System RAM 3 " kunit_release_action test , remove_free_resource , parent ) ;
. r1 test , REGION_INTERSECTS ,
} {
. r1 = & r4 , . r2 = & r0 , . r . start = R4_START , . r . end = R4_END , . ret = true ,
} {
. r1 = & r2 , . r2 = & r1 , . ret = false ,
} , {
. r1 = & r3 , . r2 = & r1 , . ret = false ,
,
r1 = & , r2 = & r1 , . . start R4_START , r . = R1_END , ret = true ,
} , {
,
} , {
. r1 & 2 , r2 & 4 , r . = = true ,
} , {
. r1 = & r3 , . r2 = & r4 , . r . start = R3_START , . r . end = R4_END , . ret = true ,
} ,
} ;
static void resource_do_test ( struct kunit * test , bool ret , struct resource * r ,
bool exp_ret , struct resource * exp_r ,
struct resource * r1 , struct resource * r2 )
{
KUNIT_EXPECT_EQ_MSG ( test , ret , exp_ret , " Resources % pR % pR " , r1 , r2 ) ;
KUNIT_EXPECT_EQ_MSG ( test , r - > start , exp_r - > start , " Start elements are not equal " ) ;
KUNIT_EXPECT_EQ_MSG ( test , r - > end , exp_r - > end , " End elements are not equal " ) ;
}
static void resource_do_union_test ( struct kunit * test , struct result * r )
{
struct resource result ;
bool ret ;
memset ( & result , 0 , sizeof ( result ) ) ;
ret = resource_union ( r - > r1 , r - > r2 , & result ) ;
resource_do_test ( test , ret , & result , r - > ret , & r - > r , r - > r1 , r - > r2 ) ;
memset ( & result , 0 , sizeof ( result ) ) ;
ret = resource_union ( r - > r2 , r - > r1 , & result ) ;
resource_do_test ( test , ret , & result , r - > ret , & r - > r , r - > r2 , r - > r1 ) ;
}
static void resource_test_union ( struct kunit * test )
{
struct result * r = results_for_union ;
unsigned int i = 0 ;
do {
resource_do_union_test ( test , & r [ i ] ) ;
} while ( + + i < ARRAY_SIZE ( results_for_union ) ) ;
}
static void resource_do_intersection_test ( struct kunit * test , struct result * r )
{
struct resource result ;
bool ret ;
memset ( & result , 0 , sizeof ( result ) ) ;
ret = resource_intersection ( r - > r1 , r - > r2 , & result ) ;
resource_do_test ( test , ret , & result , r - > ret , & r - > r , r - > r1 , r - > r2 ) ;
memset ( & result , 0 , sizeof ( result ) ) ;
ret = resource_intersection ( r - > r2 , r - > r1 , & result ) ;
resource_do_test ( test , ret , & result , r - > ret , & r - > r , r - > r2 , r - > r1 ) ;
}
static void resource_test_intersection ( struct kunit * test )
{
struct result * r = results_for_intersection ;
unsigned int i = 0 ;
do {
resource_do_intersection_test ( test , & r [ i ] ) ;
} while ( + + i < ARRAY_SIZE ( results_for_intersection ) ) ;
}
/*
* The test resource tree for region_intersects ( ) test :
*
* BASE - BASE + 1 M - 1 : Test System RAM 0
* # hole 0 ( BASE + 1 M - BASE + 2 M )
* BASE + 2 M - BASE + 3 M - 1 : Test CXL Window 0
* BASE + 3 M - BASE + 4 M - 1 : Test System RAM 1
* BASE + 4 M - BASE + 7 M - 1 : Test CXL Window 1
* BASE + 4 M - BASE + 5 M - 1 : Test System RAM 2
* BASE + 4 M + 128 K - BASE + 4 M + 256 K - 1 : Test Code
* BASE + 5 M - BASE + 6 M - 1 : Test System RAM 3
*/
#define RES_TEST_RAM0_OFFSET 0
#define RES_TEST_RAM0_SIZE SZ_1M
#define RES_TEST_HOLE0_OFFSET (RES_TEST_RAM0_OFFSET + RES_TEST_RAM0_SIZE)
#define RES_TEST_HOLE0_SIZE SZ_1M
#define RES_TEST_WIN0_OFFSET (RES_TEST_HOLE0_OFFSET + RES_TEST_HOLE0_SIZE)
#define RES_TEST_WIN0_SIZE SZ_1M
#define RES_TEST_RAM1_OFFSET (RES_TEST_WIN0_OFFSET + RES_TEST_WIN0_SIZE)
#define RES_TEST_RAM1_SIZE SZ_1M
#define RES_TEST_WIN1_OFFSET (RES_TEST_RAM1_OFFSET + RES_TEST_RAM1_SIZE)
#define RES_TEST_WIN1_SIZE (SZ_1M * 3 )
#define RES_TEST_RAM2_OFFSET RES_TEST_WIN1_OFFSET
#define RES_TEST_RAM2_SIZE SZ_1M
#define RES_TEST_CODE_OFFSET (RES_TEST_RAM2_OFFSET + SZ_128K)
#define RES_TEST_CODE_SIZE SZ_128K
#define RES_TEST_RAM3_OFFSET (RES_TEST_RAM2_OFFSET + RES_TEST_RAM2_SIZE)
#define RES_TEST_RAM3_SIZE SZ_1M
#define RES_TEST_TOTAL_SIZE ((RES_TEST_WIN1_OFFSET + RES_TEST_WIN1_SIZE))
KUNIT_DEFINE_ACTION_WRAPPER(kfree_wrapper, kfree, const void *);
static void remove_free_resource(void *ctx)
{
struct resource *res = (struct resource *)ctx;
remove_resource(res);
kfree(res);
}
static void resource_test_add_action_or_abort(
struct kunit *test, void (*action)(void *), void *ctx)
{
KUNIT_ASSERT_EQ_MSG(test, 0 ,
kunit_add_action_or_reset(test, action, ctx),
"Fail to add action" );
}
static void resource_test_request_region(struct kunit *test, struct resource *parent,
resource_size_t start, resource_size_t size,
const char *name, unsigned long flags)
{
struct resource *res;
res = __request_region(parent, start, size, name, flags);
KUNIT_ASSERT_NOT_NULL(test, res);
resource_test_add_action_or_abort(test, remove_free_resource, res);
}
static void resource_test_insert_resource(struct kunit *test, struct resource *parent,
resource_size_t start, resource_size_t size,
const char *name, unsigned long flags)
{
struct resource *res;
res = kzalloc(sizeof (*res), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, res);
res->name = name;
res->start = start;
res->end = start + size - 1 ;
res->flags = flags;
if (insert_resource(parent, res)) {
resource_test_add_action_or_abort(test, kfree_wrapper, res);
KUNIT_FAIL_AND_ABORT(test, "Fail to insert resource %pR\n" , res);
}
resource_test_add_action_or_abort(test, remove_free_resource, res);
}
static void resource_test_region_intersects(struct kunit *test)
{
unsigned long flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
struct resource *parent;
resource_size_t start;
/* Find an iomem_resource hole to hold test resources */
parent = alloc_free_mem_region(&iomem_resource, RES_TEST_TOTAL_SIZE, SZ_1M,
"test resources" );
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent);
start = parent->start;
resource_test_add_action_or_abort(test, remove_free_resource, parent);
resource_test_request_region(test, parent, start + RES_TEST_RAM0_OFFSET,
RES_TEST_RAM0_SIZE, "Test System RAM 0" , flags);
resource_test_insert_resource(test, parent, start + RES_TEST_WIN0_OFFSET,
RES_TEST_WIN0_SIZE, "Test CXL Window 0" ,
IORESOURCE_MEM);
resource_test_request_region(test, parent, start + RES_TEST_RAM1_OFFSET,
RES_TEST_RAM1_SIZE, "Test System RAM 1" , flags);
resource_test_insert_resource(test, parent, start + RES_TEST_WIN1_OFFSET,
RES_TEST_WIN1_SIZE, "Test CXL Window 1" ,
IORESOURCE_MEM);
resource_test_request_region(test, parent, start + RES_TEST_RAM2_OFFSET,
RES_TEST_RAM2_SIZE, "Test System RAM 2" , flags);
resource_test_insert_resource(test, parent, start + RES_TEST_CODE_OFFSET,
RES_TEST_CODE_SIZE, "Test Code" , flags);
resource_test_request_region(test, parent, start + RES_TEST_RAM3_OFFSET,
RES_TEST_RAM3_SIZE, "Test System RAM 3" , flags);
kunit_release_action(test, remove_free_resource, parent);
KUNIT_EXPECT_EQ(test, REGION_INTERSECTS,
region_intersects(start + RES_TEST_RAM0_OFFSET, PAGE_SIZE,
IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
KUNIT_EXPECT_EQ(test, REGION_INTERSECTS,
region_intersects(start + RES_TEST_RAM0_OFFSET +
RES_TEST_RAM0_SIZE - PAGE_SIZE, 2 * PAGE_SIZE,
IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
KUNIT_EXPECT_EQ(test, REGION_DISJOINT,
region_intersects(start + RES_TEST_HOLE0_OFFSET, PAGE_SIZE,
IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
KUNIT_EXPECT_EQ(test, REGION_DISJOINT,
region_intersects(start + RES_TEST_HOLE0_OFFSET +
RES_TEST_HOLE0_SIZE - PAGE_SIZE, 2 * PAGE_SIZE,
IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
KUNIT_EXPECT_EQ(test, REGION_MIXED,
region_intersects(start + RES_TEST_WIN0_OFFSET +
RES_TEST_WIN0_SIZE - PAGE_SIZE, 2 * PAGE_SIZE,
IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
KUNIT_EXPECT_EQ(test, REGION_INTERSECTS,
region_intersects(start + RES_TEST_RAM1_OFFSET +
RES_TEST_RAM1_SIZE - PAGE_SIZE, 2 * PAGE_SIZE,
IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
KUNIT_EXPECT_EQ(test, REGION_INTERSECTS,
region_intersects(start + RES_TEST_RAM2_OFFSET +
RES_TEST_RAM2_SIZE - PAGE_SIZE, 2 * PAGE_SIZE,
IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
KUNIT_EXPECT_EQ(test, REGION_INTERSECTS,
region_intersects(start + RES_TEST_CODE_OFFSET, PAGE_SIZE,
IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
KUNIT_EXPECT_EQ(test, REGION_INTERSECTS,
region_intersects(start + RES_TEST_RAM2_OFFSET,
RES_TEST_RAM2_SIZE + PAGE_SIZE,
IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
KUNIT_EXPECT_EQ(test, REGION_MIXED,
region_intersects(start + RES_TEST_RAM3_OFFSET,
RES_TEST_RAM3_SIZE + PAGE_SIZE,
IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE));
}
static struct kunit_case resource_test_cases[] = {
KUNIT_CASE(resource_test_union),
KUNIT_CASE(resource_test_intersection),
KUNIT_CASE(resource_test_region_intersects),
{}
};
static struct kunit_suite resource_test_suite = {
.name = "resource" ,
.test_cases = resource_test_cases,
};
kunit_test_suite(resource_test_suite);
MODULE_DESCRIPTION("I/O Port & Memory Resource manager unit tests" );
MODULE_LICENSE("GPL" );
Messung V0.5 in Prozent C=94 H=96 G=94
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.10Bemerkung:
¤
*Bot Zugriff