174fe6c29SRuslan Bukin /*
2*85f87cf4SRuslan Bukin * Copyright (c) 2017-2019, Intel Corporation
374fe6c29SRuslan Bukin *
474fe6c29SRuslan Bukin * Redistribution and use in source and binary forms, with or without
574fe6c29SRuslan Bukin * modification, are permitted provided that the following conditions are met:
674fe6c29SRuslan Bukin *
774fe6c29SRuslan Bukin * * Redistributions of source code must retain the above copyright notice,
874fe6c29SRuslan Bukin * this list of conditions and the following disclaimer.
974fe6c29SRuslan Bukin * * Redistributions in binary form must reproduce the above copyright notice,
1074fe6c29SRuslan Bukin * this list of conditions and the following disclaimer in the documentation
1174fe6c29SRuslan Bukin * and/or other materials provided with the distribution.
1274fe6c29SRuslan Bukin * * Neither the name of Intel Corporation nor the names of its contributors
1374fe6c29SRuslan Bukin * may be used to endorse or promote products derived from this software
1474fe6c29SRuslan Bukin * without specific prior written permission.
1574fe6c29SRuslan Bukin *
1674fe6c29SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1774fe6c29SRuslan Bukin * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1874fe6c29SRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1974fe6c29SRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2074fe6c29SRuslan Bukin * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2174fe6c29SRuslan Bukin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2274fe6c29SRuslan Bukin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2374fe6c29SRuslan Bukin * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2474fe6c29SRuslan Bukin * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2574fe6c29SRuslan Bukin * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2674fe6c29SRuslan Bukin * POSSIBILITY OF SUCH DAMAGE.
2774fe6c29SRuslan Bukin */
2874fe6c29SRuslan Bukin
2974fe6c29SRuslan Bukin #include "ptunit.h"
3074fe6c29SRuslan Bukin
3174fe6c29SRuslan Bukin #include "pt_msec_cache.h"
3274fe6c29SRuslan Bukin
3374fe6c29SRuslan Bukin #include "intel-pt.h"
3474fe6c29SRuslan Bukin
3574fe6c29SRuslan Bukin
pt_section_get(struct pt_section * section)3674fe6c29SRuslan Bukin int pt_section_get(struct pt_section *section)
3774fe6c29SRuslan Bukin {
3874fe6c29SRuslan Bukin uint16_t ucount;
3974fe6c29SRuslan Bukin
4074fe6c29SRuslan Bukin if (!section)
4174fe6c29SRuslan Bukin return -pte_internal;
4274fe6c29SRuslan Bukin
4374fe6c29SRuslan Bukin ucount = section->ucount + 1;
4474fe6c29SRuslan Bukin if (!ucount)
4574fe6c29SRuslan Bukin return -pte_overflow;
4674fe6c29SRuslan Bukin
4774fe6c29SRuslan Bukin section->ucount = ucount;
4874fe6c29SRuslan Bukin return 0;
4974fe6c29SRuslan Bukin }
5074fe6c29SRuslan Bukin
pt_section_put(struct pt_section * section)5174fe6c29SRuslan Bukin int pt_section_put(struct pt_section *section)
5274fe6c29SRuslan Bukin {
5374fe6c29SRuslan Bukin uint16_t ucount;
5474fe6c29SRuslan Bukin
5574fe6c29SRuslan Bukin if (!section)
5674fe6c29SRuslan Bukin return -pte_internal;
5774fe6c29SRuslan Bukin
5874fe6c29SRuslan Bukin ucount = section->ucount;
5974fe6c29SRuslan Bukin if (!ucount)
6074fe6c29SRuslan Bukin return -pte_overflow;
6174fe6c29SRuslan Bukin
6274fe6c29SRuslan Bukin section->ucount = ucount - 1;
6374fe6c29SRuslan Bukin return 0;
6474fe6c29SRuslan Bukin }
6574fe6c29SRuslan Bukin
pt_section_map(struct pt_section * section)6674fe6c29SRuslan Bukin int pt_section_map(struct pt_section *section)
6774fe6c29SRuslan Bukin {
6874fe6c29SRuslan Bukin uint16_t ucount, mcount;
6974fe6c29SRuslan Bukin
7074fe6c29SRuslan Bukin if (!section)
7174fe6c29SRuslan Bukin return -pte_internal;
7274fe6c29SRuslan Bukin
7374fe6c29SRuslan Bukin ucount = section->ucount;
7474fe6c29SRuslan Bukin if (!ucount)
7574fe6c29SRuslan Bukin return -pte_internal;
7674fe6c29SRuslan Bukin
7774fe6c29SRuslan Bukin mcount = section->mcount + 1;
7874fe6c29SRuslan Bukin if (!mcount)
7974fe6c29SRuslan Bukin return -pte_overflow;
8074fe6c29SRuslan Bukin
8174fe6c29SRuslan Bukin section->mcount = mcount;
8274fe6c29SRuslan Bukin return 0;
8374fe6c29SRuslan Bukin }
8474fe6c29SRuslan Bukin
pt_section_unmap(struct pt_section * section)8574fe6c29SRuslan Bukin int pt_section_unmap(struct pt_section *section)
8674fe6c29SRuslan Bukin {
8774fe6c29SRuslan Bukin uint16_t ucount, mcount;
8874fe6c29SRuslan Bukin
8974fe6c29SRuslan Bukin if (!section)
9074fe6c29SRuslan Bukin return -pte_internal;
9174fe6c29SRuslan Bukin
9274fe6c29SRuslan Bukin ucount = section->ucount;
9374fe6c29SRuslan Bukin if (!ucount)
9474fe6c29SRuslan Bukin return -pte_internal;
9574fe6c29SRuslan Bukin
9674fe6c29SRuslan Bukin mcount = section->mcount;
9774fe6c29SRuslan Bukin if (!mcount)
9874fe6c29SRuslan Bukin return -pte_overflow;
9974fe6c29SRuslan Bukin
10074fe6c29SRuslan Bukin section->mcount = mcount - 1;
10174fe6c29SRuslan Bukin return 0;
10274fe6c29SRuslan Bukin }
10374fe6c29SRuslan Bukin
10474fe6c29SRuslan Bukin /* A mock image. */
10574fe6c29SRuslan Bukin struct pt_image {
10674fe6c29SRuslan Bukin /* The section stored in the image.
10774fe6c29SRuslan Bukin *
10874fe6c29SRuslan Bukin * This is either the fixture's section or NULL.
10974fe6c29SRuslan Bukin */
11074fe6c29SRuslan Bukin struct pt_section *section;
11174fe6c29SRuslan Bukin };
11274fe6c29SRuslan Bukin
11374fe6c29SRuslan Bukin extern int pt_image_validate(struct pt_image *, struct pt_mapped_section *,
11474fe6c29SRuslan Bukin uint64_t, int);
11574fe6c29SRuslan Bukin extern int pt_image_find(struct pt_image *, struct pt_mapped_section *,
11674fe6c29SRuslan Bukin const struct pt_asid *, uint64_t);
11774fe6c29SRuslan Bukin
pt_image_validate(struct pt_image * image,struct pt_mapped_section * msec,uint64_t vaddr,int isid)11874fe6c29SRuslan Bukin int pt_image_validate(struct pt_image *image, struct pt_mapped_section *msec,
11974fe6c29SRuslan Bukin uint64_t vaddr, int isid)
12074fe6c29SRuslan Bukin {
12174fe6c29SRuslan Bukin struct pt_section *section;
12274fe6c29SRuslan Bukin
12374fe6c29SRuslan Bukin (void) vaddr;
12474fe6c29SRuslan Bukin (void) isid;
12574fe6c29SRuslan Bukin
12674fe6c29SRuslan Bukin if (!image || !msec)
12774fe6c29SRuslan Bukin return -pte_internal;
12874fe6c29SRuslan Bukin
12974fe6c29SRuslan Bukin section = image->section;
13074fe6c29SRuslan Bukin if (!section)
13174fe6c29SRuslan Bukin return -pte_nomap;
13274fe6c29SRuslan Bukin
13374fe6c29SRuslan Bukin if (section != msec->section)
13474fe6c29SRuslan Bukin return -pte_nomap;
13574fe6c29SRuslan Bukin
13674fe6c29SRuslan Bukin return 0;
13774fe6c29SRuslan Bukin }
13874fe6c29SRuslan Bukin
pt_image_find(struct pt_image * image,struct pt_mapped_section * msec,const struct pt_asid * asid,uint64_t vaddr)13974fe6c29SRuslan Bukin int pt_image_find(struct pt_image *image, struct pt_mapped_section *msec,
14074fe6c29SRuslan Bukin const struct pt_asid *asid, uint64_t vaddr)
14174fe6c29SRuslan Bukin {
14274fe6c29SRuslan Bukin struct pt_section *section;
14374fe6c29SRuslan Bukin
14474fe6c29SRuslan Bukin (void) vaddr;
14574fe6c29SRuslan Bukin
14674fe6c29SRuslan Bukin if (!image || !msec || !asid)
14774fe6c29SRuslan Bukin return -pte_internal;
14874fe6c29SRuslan Bukin
14974fe6c29SRuslan Bukin section = image->section;
15074fe6c29SRuslan Bukin if (!section)
15174fe6c29SRuslan Bukin return -pte_nomap;
15274fe6c29SRuslan Bukin
15374fe6c29SRuslan Bukin if (msec->section)
15474fe6c29SRuslan Bukin return -pte_internal;
15574fe6c29SRuslan Bukin
15674fe6c29SRuslan Bukin msec->section = section;
15774fe6c29SRuslan Bukin
15874fe6c29SRuslan Bukin return pt_section_get(section);
15974fe6c29SRuslan Bukin }
16074fe6c29SRuslan Bukin
16174fe6c29SRuslan Bukin /* A test fixture providing a section and checking the use and map count. */
16274fe6c29SRuslan Bukin struct test_fixture {
16374fe6c29SRuslan Bukin /* A test section. */
16474fe6c29SRuslan Bukin struct pt_section section;
16574fe6c29SRuslan Bukin
16674fe6c29SRuslan Bukin /* A test cache. */
16774fe6c29SRuslan Bukin struct pt_msec_cache mcache;
16874fe6c29SRuslan Bukin
16974fe6c29SRuslan Bukin /* A test image. */
17074fe6c29SRuslan Bukin struct pt_image image;
17174fe6c29SRuslan Bukin
17274fe6c29SRuslan Bukin /* The test fixture initialization and finalization functions. */
17374fe6c29SRuslan Bukin struct ptunit_result (*init)(struct test_fixture *);
17474fe6c29SRuslan Bukin struct ptunit_result (*fini)(struct test_fixture *);
17574fe6c29SRuslan Bukin };
17674fe6c29SRuslan Bukin
init_null(void)17774fe6c29SRuslan Bukin static struct ptunit_result init_null(void)
17874fe6c29SRuslan Bukin {
17974fe6c29SRuslan Bukin int status;
18074fe6c29SRuslan Bukin
18174fe6c29SRuslan Bukin status = pt_msec_cache_init(NULL);
18274fe6c29SRuslan Bukin ptu_int_eq(status, -pte_internal);
18374fe6c29SRuslan Bukin
18474fe6c29SRuslan Bukin return ptu_passed();
18574fe6c29SRuslan Bukin }
18674fe6c29SRuslan Bukin
fini_null(void)18774fe6c29SRuslan Bukin static struct ptunit_result fini_null(void)
18874fe6c29SRuslan Bukin {
18974fe6c29SRuslan Bukin pt_msec_cache_fini(NULL);
19074fe6c29SRuslan Bukin
19174fe6c29SRuslan Bukin return ptu_passed();
19274fe6c29SRuslan Bukin }
19374fe6c29SRuslan Bukin
invalidate_null(void)19474fe6c29SRuslan Bukin static struct ptunit_result invalidate_null(void)
19574fe6c29SRuslan Bukin {
19674fe6c29SRuslan Bukin int status;
19774fe6c29SRuslan Bukin
19874fe6c29SRuslan Bukin status = pt_msec_cache_invalidate(NULL);
19974fe6c29SRuslan Bukin ptu_int_eq(status, -pte_internal);
20074fe6c29SRuslan Bukin
20174fe6c29SRuslan Bukin return ptu_passed();
20274fe6c29SRuslan Bukin }
20374fe6c29SRuslan Bukin
read_null(void)20474fe6c29SRuslan Bukin static struct ptunit_result read_null(void)
20574fe6c29SRuslan Bukin {
20674fe6c29SRuslan Bukin const struct pt_mapped_section *msec;
20774fe6c29SRuslan Bukin struct pt_msec_cache mcache;
20874fe6c29SRuslan Bukin struct pt_image image;
20974fe6c29SRuslan Bukin int status;
21074fe6c29SRuslan Bukin
21174fe6c29SRuslan Bukin status = pt_msec_cache_read(NULL, &msec, &image, 0ull);
21274fe6c29SRuslan Bukin ptu_int_eq(status, -pte_internal);
21374fe6c29SRuslan Bukin
21474fe6c29SRuslan Bukin status = pt_msec_cache_read(&mcache, NULL, &image, 0ull);
21574fe6c29SRuslan Bukin ptu_int_eq(status, -pte_internal);
21674fe6c29SRuslan Bukin
21774fe6c29SRuslan Bukin status = pt_msec_cache_read(&mcache, &msec, NULL, 0ull);
21874fe6c29SRuslan Bukin ptu_int_eq(status, -pte_internal);
21974fe6c29SRuslan Bukin
22074fe6c29SRuslan Bukin return ptu_passed();
22174fe6c29SRuslan Bukin }
22274fe6c29SRuslan Bukin
fill_null(void)22374fe6c29SRuslan Bukin static struct ptunit_result fill_null(void)
22474fe6c29SRuslan Bukin {
22574fe6c29SRuslan Bukin const struct pt_mapped_section *msec;
22674fe6c29SRuslan Bukin struct pt_msec_cache mcache;
22774fe6c29SRuslan Bukin struct pt_image image;
22874fe6c29SRuslan Bukin struct pt_asid asid;
22974fe6c29SRuslan Bukin int status;
23074fe6c29SRuslan Bukin
23174fe6c29SRuslan Bukin memset(&mcache, 0, sizeof(mcache));
23274fe6c29SRuslan Bukin
23374fe6c29SRuslan Bukin status = pt_msec_cache_fill(NULL, &msec, &image, &asid, 0ull);
23474fe6c29SRuslan Bukin ptu_int_eq(status, -pte_internal);
23574fe6c29SRuslan Bukin
23674fe6c29SRuslan Bukin status = pt_msec_cache_fill(&mcache, NULL, &image, &asid, 0ull);
23774fe6c29SRuslan Bukin ptu_int_eq(status, -pte_internal);
23874fe6c29SRuslan Bukin
23974fe6c29SRuslan Bukin status = pt_msec_cache_fill(&mcache, &msec, NULL, &asid, 0ull);
24074fe6c29SRuslan Bukin ptu_int_eq(status, -pte_internal);
24174fe6c29SRuslan Bukin
24274fe6c29SRuslan Bukin status = pt_msec_cache_fill(&mcache, &msec, &image, NULL, 0ull);
24374fe6c29SRuslan Bukin ptu_int_eq(status, -pte_internal);
24474fe6c29SRuslan Bukin
24574fe6c29SRuslan Bukin return ptu_passed();
24674fe6c29SRuslan Bukin }
24774fe6c29SRuslan Bukin
invalidate(struct test_fixture * tfix)24874fe6c29SRuslan Bukin static struct ptunit_result invalidate(struct test_fixture *tfix)
24974fe6c29SRuslan Bukin {
25074fe6c29SRuslan Bukin struct pt_section *section;
25174fe6c29SRuslan Bukin int status;
25274fe6c29SRuslan Bukin
25374fe6c29SRuslan Bukin status = pt_msec_cache_invalidate(&tfix->mcache);
25474fe6c29SRuslan Bukin ptu_int_eq(status, 0);
25574fe6c29SRuslan Bukin
25674fe6c29SRuslan Bukin section = pt_msec_section(&tfix->mcache.msec);
25774fe6c29SRuslan Bukin ptu_null(section);
25874fe6c29SRuslan Bukin
25974fe6c29SRuslan Bukin ptu_uint_eq(tfix->section.mcount, 0);
26074fe6c29SRuslan Bukin ptu_uint_eq(tfix->section.ucount, 0);
26174fe6c29SRuslan Bukin
26274fe6c29SRuslan Bukin return ptu_passed();
26374fe6c29SRuslan Bukin }
26474fe6c29SRuslan Bukin
read_nomap(struct test_fixture * tfix)26574fe6c29SRuslan Bukin static struct ptunit_result read_nomap(struct test_fixture *tfix)
26674fe6c29SRuslan Bukin {
26774fe6c29SRuslan Bukin const struct pt_mapped_section *msec;
26874fe6c29SRuslan Bukin int status;
26974fe6c29SRuslan Bukin
27074fe6c29SRuslan Bukin msec = NULL;
27174fe6c29SRuslan Bukin
27274fe6c29SRuslan Bukin status = pt_msec_cache_read(&tfix->mcache, &msec, &tfix->image, 0ull);
27374fe6c29SRuslan Bukin ptu_int_eq(status, -pte_nomap);
27474fe6c29SRuslan Bukin ptu_null(msec);
27574fe6c29SRuslan Bukin
27674fe6c29SRuslan Bukin return ptu_passed();
27774fe6c29SRuslan Bukin }
27874fe6c29SRuslan Bukin
read(struct test_fixture * tfix)27974fe6c29SRuslan Bukin static struct ptunit_result read(struct test_fixture *tfix)
28074fe6c29SRuslan Bukin {
28174fe6c29SRuslan Bukin const struct pt_mapped_section *msec;
28274fe6c29SRuslan Bukin struct pt_section *section;
28374fe6c29SRuslan Bukin int status;
28474fe6c29SRuslan Bukin
28574fe6c29SRuslan Bukin status = pt_msec_cache_read(&tfix->mcache, &msec, &tfix->image, 0ull);
28674fe6c29SRuslan Bukin ptu_int_eq(status, 0);
28774fe6c29SRuslan Bukin
28874fe6c29SRuslan Bukin ptu_ptr_eq(msec, &tfix->mcache.msec);
28974fe6c29SRuslan Bukin
29074fe6c29SRuslan Bukin section = pt_msec_section(msec);
29174fe6c29SRuslan Bukin ptu_ptr_eq(section, &tfix->section);
29274fe6c29SRuslan Bukin
29374fe6c29SRuslan Bukin return ptu_passed();
29474fe6c29SRuslan Bukin }
29574fe6c29SRuslan Bukin
fill_nomap(struct test_fixture * tfix)29674fe6c29SRuslan Bukin static struct ptunit_result fill_nomap(struct test_fixture *tfix)
29774fe6c29SRuslan Bukin {
29874fe6c29SRuslan Bukin const struct pt_mapped_section *msec;
29974fe6c29SRuslan Bukin struct pt_asid asid;
30074fe6c29SRuslan Bukin struct pt_section *section;
30174fe6c29SRuslan Bukin int status;
30274fe6c29SRuslan Bukin
30374fe6c29SRuslan Bukin msec = NULL;
30474fe6c29SRuslan Bukin
30574fe6c29SRuslan Bukin status = pt_msec_cache_fill(&tfix->mcache, &msec, &tfix->image, &asid,
30674fe6c29SRuslan Bukin 0ull);
30774fe6c29SRuslan Bukin ptu_int_eq(status, -pte_nomap);
30874fe6c29SRuslan Bukin
30974fe6c29SRuslan Bukin section = pt_msec_section(&tfix->mcache.msec);
31074fe6c29SRuslan Bukin ptu_null(section);
31174fe6c29SRuslan Bukin ptu_null(msec);
31274fe6c29SRuslan Bukin
31374fe6c29SRuslan Bukin ptu_uint_eq(tfix->section.mcount, 0);
31474fe6c29SRuslan Bukin ptu_uint_eq(tfix->section.ucount, 0);
31574fe6c29SRuslan Bukin
31674fe6c29SRuslan Bukin return ptu_passed();
31774fe6c29SRuslan Bukin }
31874fe6c29SRuslan Bukin
fill(struct test_fixture * tfix)31974fe6c29SRuslan Bukin static struct ptunit_result fill(struct test_fixture *tfix)
32074fe6c29SRuslan Bukin {
32174fe6c29SRuslan Bukin const struct pt_mapped_section *msec;
32274fe6c29SRuslan Bukin struct pt_section *section;
32374fe6c29SRuslan Bukin struct pt_asid asid;
32474fe6c29SRuslan Bukin int status;
32574fe6c29SRuslan Bukin
32674fe6c29SRuslan Bukin status = pt_msec_cache_fill(&tfix->mcache, &msec, &tfix->image, &asid,
32774fe6c29SRuslan Bukin 0ull);
32874fe6c29SRuslan Bukin ptu_int_eq(status, 0);
32974fe6c29SRuslan Bukin
33074fe6c29SRuslan Bukin ptu_ptr_eq(msec, &tfix->mcache.msec);
33174fe6c29SRuslan Bukin
33274fe6c29SRuslan Bukin section = pt_msec_section(msec);
33374fe6c29SRuslan Bukin ptu_ptr_eq(section, &tfix->section);
33474fe6c29SRuslan Bukin
33574fe6c29SRuslan Bukin ptu_uint_eq(section->mcount, 1);
33674fe6c29SRuslan Bukin ptu_uint_eq(section->ucount, 1);
33774fe6c29SRuslan Bukin
33874fe6c29SRuslan Bukin return ptu_passed();
33974fe6c29SRuslan Bukin }
34074fe6c29SRuslan Bukin
sfix_init(struct test_fixture * tfix)34174fe6c29SRuslan Bukin static struct ptunit_result sfix_init(struct test_fixture *tfix)
34274fe6c29SRuslan Bukin {
34374fe6c29SRuslan Bukin memset(&tfix->section, 0, sizeof(tfix->section));
34474fe6c29SRuslan Bukin memset(&tfix->mcache, 0, sizeof(tfix->mcache));
34574fe6c29SRuslan Bukin memset(&tfix->image, 0, sizeof(tfix->image));
34674fe6c29SRuslan Bukin
34774fe6c29SRuslan Bukin return ptu_passed();
34874fe6c29SRuslan Bukin }
34974fe6c29SRuslan Bukin
ifix_init(struct test_fixture * tfix)35074fe6c29SRuslan Bukin static struct ptunit_result ifix_init(struct test_fixture *tfix)
35174fe6c29SRuslan Bukin {
35274fe6c29SRuslan Bukin ptu_test(sfix_init, tfix);
35374fe6c29SRuslan Bukin
35474fe6c29SRuslan Bukin tfix->image.section = &tfix->section;
35574fe6c29SRuslan Bukin
35674fe6c29SRuslan Bukin return ptu_passed();
35774fe6c29SRuslan Bukin }
35874fe6c29SRuslan Bukin
cfix_init(struct test_fixture * tfix)35974fe6c29SRuslan Bukin static struct ptunit_result cfix_init(struct test_fixture *tfix)
36074fe6c29SRuslan Bukin {
36174fe6c29SRuslan Bukin ptu_test(sfix_init, tfix);
36274fe6c29SRuslan Bukin
36374fe6c29SRuslan Bukin tfix->mcache.msec.section = &tfix->section;
36474fe6c29SRuslan Bukin
36574fe6c29SRuslan Bukin tfix->section.ucount = 1;
36674fe6c29SRuslan Bukin tfix->section.mcount = 1;
36774fe6c29SRuslan Bukin
36874fe6c29SRuslan Bukin return ptu_passed();
36974fe6c29SRuslan Bukin }
37074fe6c29SRuslan Bukin
cifix_init(struct test_fixture * tfix)37174fe6c29SRuslan Bukin static struct ptunit_result cifix_init(struct test_fixture *tfix)
37274fe6c29SRuslan Bukin {
37374fe6c29SRuslan Bukin ptu_test(cfix_init, tfix);
37474fe6c29SRuslan Bukin
37574fe6c29SRuslan Bukin tfix->image.section = &tfix->section;
37674fe6c29SRuslan Bukin
37774fe6c29SRuslan Bukin return ptu_passed();
37874fe6c29SRuslan Bukin }
37974fe6c29SRuslan Bukin
main(int argc,char ** argv)38074fe6c29SRuslan Bukin int main(int argc, char **argv)
38174fe6c29SRuslan Bukin {
38274fe6c29SRuslan Bukin struct ptunit_suite suite;
38374fe6c29SRuslan Bukin struct test_fixture sfix, ifix, cfix, cifix;
38474fe6c29SRuslan Bukin
38574fe6c29SRuslan Bukin sfix.init = sfix_init;
38674fe6c29SRuslan Bukin sfix.fini = NULL;
38774fe6c29SRuslan Bukin
38874fe6c29SRuslan Bukin ifix.init = ifix_init;
38974fe6c29SRuslan Bukin ifix.fini = NULL;
39074fe6c29SRuslan Bukin
39174fe6c29SRuslan Bukin cfix.init = cfix_init;
39274fe6c29SRuslan Bukin cfix.fini = NULL;
39374fe6c29SRuslan Bukin
39474fe6c29SRuslan Bukin cifix.init = cifix_init;
39574fe6c29SRuslan Bukin cifix.fini = NULL;
39674fe6c29SRuslan Bukin
39774fe6c29SRuslan Bukin suite = ptunit_mk_suite(argc, argv);
39874fe6c29SRuslan Bukin
39974fe6c29SRuslan Bukin ptu_run(suite, init_null);
40074fe6c29SRuslan Bukin ptu_run(suite, fini_null);
40174fe6c29SRuslan Bukin ptu_run(suite, invalidate_null);
40274fe6c29SRuslan Bukin ptu_run(suite, read_null);
40374fe6c29SRuslan Bukin ptu_run(suite, fill_null);
40474fe6c29SRuslan Bukin
40574fe6c29SRuslan Bukin ptu_run_f(suite, invalidate, sfix);
40674fe6c29SRuslan Bukin ptu_run_f(suite, invalidate, cfix);
40774fe6c29SRuslan Bukin
40874fe6c29SRuslan Bukin ptu_run_f(suite, read_nomap, sfix);
40974fe6c29SRuslan Bukin ptu_run_f(suite, read_nomap, ifix);
41074fe6c29SRuslan Bukin ptu_run_f(suite, read_nomap, cfix);
41174fe6c29SRuslan Bukin ptu_run_f(suite, read, cifix);
41274fe6c29SRuslan Bukin
41374fe6c29SRuslan Bukin ptu_run_f(suite, fill_nomap, sfix);
41474fe6c29SRuslan Bukin ptu_run_f(suite, fill_nomap, cfix);
41574fe6c29SRuslan Bukin ptu_run_f(suite, fill, ifix);
41674fe6c29SRuslan Bukin ptu_run_f(suite, fill, cifix);
41774fe6c29SRuslan Bukin
41874fe6c29SRuslan Bukin return ptunit_report(&suite);
41974fe6c29SRuslan Bukin }
420