blob: 2ab8449d8819e595ba145cab1d348bf6018c3eb7 [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <sys/mman.h>
#include <trusty_unittest.h>
#define TEST1_ID 1
#define TEST1_PHY_BASE_ADDR 0x70000000U
#define TEST1_REG_SIZE 0x1000U
#define TEST2_ID 2
#define TEST2_PHY_BASE_ADDR 0x70010000U
#define TEST2_REG_SIZE 0x100U
#define TEST3_ID 3
#define TEST3_PHY_BASE_ADDR 0x70020000U
#define TEST3_REG_SIZE 0x4U
typedef struct manifest_test {
} manifest_test_t;
TEST_F_SETUP(manifest_test) {}
TEST_F_TEARDOWN(manifest_test) {
test_abort:;
}
bool compare_memory_map(uint8_t* va_base, uint64_t phy_addr, uint32_t size) {
int ret;
struct dma_pmem pmem;
ASSERT_NE(va_base, MAP_FAILED);
ret = prepare_dma((void*)va_base, size,
DMA_FLAG_FROM_DEVICE | DMA_FLAG_ALLOW_PARTIAL, &pmem);
ASSERT_EQ(ret, 1);
ASSERT_NE(0, phy_addr);
ASSERT_EQ(phy_addr, pmem.paddr);
ASSERT_EQ(size, pmem.size);
return true;
test_abort:
return false;
}
TEST_F(manifest_test, mem_map_test_1) {
uint8_t* va_base = MAP_FAILED;
bool ret;
va_base = mmap(NULL, TEST1_REG_SIZE, PROT_READ | PROT_WRITE,
MMAP_FLAG_IO_HANDLE, TEST1_ID, 0);
ret = compare_memory_map(va_base, TEST1_PHY_BASE_ADDR, TEST1_REG_SIZE);
ASSERT_EQ(ret, true)
test_abort:
if (va_base != MAP_FAILED) {
munmap(va_base, TEST1_REG_SIZE);
}
}
TEST_F(manifest_test, mem_map_test_2) {
uint8_t* va_base = MAP_FAILED;
bool ret;
va_base = mmap(NULL, TEST2_REG_SIZE, PROT_READ | PROT_WRITE,
MMAP_FLAG_IO_HANDLE, TEST2_ID, 0);
ret = compare_memory_map(va_base, TEST2_PHY_BASE_ADDR, TEST2_REG_SIZE);
ASSERT_EQ(ret, true)
test_abort:
if (va_base != MAP_FAILED) {
munmap(va_base, TEST2_REG_SIZE);
}
}
TEST_F(manifest_test, mem_map_test_3) {
uint8_t* va_base = MAP_FAILED;
bool ret;
va_base = mmap(NULL, TEST3_REG_SIZE, PROT_READ | PROT_WRITE,
MMAP_FLAG_IO_HANDLE, TEST3_ID, 0);
ret = compare_memory_map(va_base, TEST3_PHY_BASE_ADDR, TEST3_REG_SIZE);
ASSERT_EQ(ret, true)
test_abort:
if (va_base != MAP_FAILED) {
munmap(va_base, TEST3_REG_SIZE);
}
}
TEST_F(manifest_test, mem_map_test_small_size) {
uint8_t* va_base = MAP_FAILED;
bool ret;
uint32_t size = 0x400;
va_base = mmap(NULL, size, PROT_READ | PROT_WRITE, MMAP_FLAG_IO_HANDLE,
TEST1_ID, 0);
ret = compare_memory_map(va_base, TEST1_PHY_BASE_ADDR, size);
ASSERT_EQ(ret, true)
test_abort:
if (va_base != MAP_FAILED) {
munmap(va_base, size);
}
}
TEST_F(manifest_test, mem_map_test_large_size) {
uint8_t* va_base = MAP_FAILED;
uint32_t size = 0x2000;
va_base = mmap(NULL, size, PROT_READ | PROT_WRITE, MMAP_FLAG_IO_HANDLE,
TEST2_ID, 0);
ASSERT_EQ(va_base, MAP_FAILED);
test_abort:
if (va_base != MAP_FAILED) {
munmap(va_base, size);
}
}
TEST_F(manifest_test, mem_map_test_unknown_id) {
uint8_t* va_base = MAP_FAILED;
uint32_t id = 100;
va_base = mmap(NULL, TEST1_REG_SIZE, PROT_READ | PROT_WRITE,
MMAP_FLAG_IO_HANDLE, id, 0);
ASSERT_EQ(va_base, MAP_FAILED);
test_abort:
if (va_base != MAP_FAILED) {
munmap(va_base, TEST1_REG_SIZE);
}
}
PORT_TEST(manifest_test, "com.android.manifesttest");