squash "base: use Dataspace_attr in io_mem _map_local(...)" - rename to "base: use Map_local_result in io_mem _map_local(...)"

Issue #5406
This commit is contained in:
Alexander Boettcher
2025-01-15 17:19:36 +01:00
committed by Norman Feske
parent 2b566042ad
commit 7c5f879b91
10 changed files with 57 additions and 46 deletions

View File

@@ -38,9 +38,8 @@ static inline bool can_use_super_page(addr_t, size_t)
}
Io_mem_session_component::Dataspace_attr Io_mem_session_component::_map_local(addr_t const phys_base,
size_t const size_in,
addr_t const req_base)
Io_mem_session_component::Map_local_result Io_mem_session_component::_map_local(addr_t const phys_base,
size_t const size_in)
{
size_t const size = size_in;
@@ -95,16 +94,16 @@ Io_mem_session_component::Dataspace_attr Io_mem_session_component::_map_local(ad
size_t align = (size >= get_super_page_size()) ? get_super_page_size_log2()
: get_page_size_log2();
return platform().region_alloc().alloc_aligned(size, align).convert<Dataspace_attr>(
return platform().region_alloc().alloc_aligned(size, align).convert<Map_local_result>(
[&] (void *ptr) {
addr_t const core_local_base = (addr_t)ptr;
map_io_region(phys_base, core_local_base, size);
return Dataspace_attr(size_in, 0, phys_base, _cacheable, req_base);
return Map_local_result { .core_local_addr = 0, .success = true };
},
[&] (Range_allocator::Alloc_error) {
error("core-local mapping of memory-mapped I/O range failed");
return Dataspace_attr();
return Map_local_result();
});
}

View File

@@ -31,28 +31,27 @@ void Io_mem_session_component::_unmap_local(addr_t base, size_t size, addr_t)
}
Io_mem_session_component::Dataspace_attr Io_mem_session_component::_map_local(addr_t const base,
size_t const size,
addr_t const req_base)
Io_mem_session_component::Map_local_result Io_mem_session_component::_map_local(addr_t const base,
size_t const size)
{
/* align large I/O dataspaces on a super-page boundary within core */
size_t alignment = (size >= get_super_page_size()) ? get_super_page_size_log2()
: get_page_size_log2();
/* find appropriate region and map it locally */
return platform().region_alloc().alloc_aligned(size, (unsigned)alignment).convert<Dataspace_attr>(
return platform().region_alloc().alloc_aligned(size, (unsigned)alignment).convert<Map_local_result>(
[&] (void *local_base) {
if (!map_local_io(base, (addr_t)local_base, size >> get_page_size_log2())) {
error("map_local_io failed ", Hex_range(base, size));
platform().region_alloc().free(local_base, base);
return Dataspace_attr();
return Map_local_result();
}
return Dataspace_attr(size, addr_t(local_base), base, _cacheable,
req_base);
return Map_local_result { .core_local_addr = addr_t(local_base),
.success = true };
},
[&] (Range_allocator::Alloc_error) {
error("allocation of virtual memory for local I/O mapping failed");
return Dataspace_attr(); });
return Map_local_result(); });
}

View File

@@ -21,9 +21,7 @@ using namespace Core;
void Io_mem_session_component::_unmap_local(addr_t, size_t, addr_t) { }
Io_mem_session_component::Dataspace_attr Io_mem_session_component::_map_local(addr_t const base,
size_t const size,
addr_t const req_base)
Io_mem_session_component::Map_local_result Io_mem_session_component::_map_local(addr_t const base, size_t)
{
return Dataspace_attr(size, base, base, _cacheable, req_base);
return { .core_local_addr = base, .success = true };
}

View File

@@ -23,9 +23,7 @@ using namespace Core;
void Io_mem_session_component::_unmap_local(addr_t, size_t, addr_t) { }
Io_mem_session_component::Dataspace_attr Io_mem_session_component::_map_local(addr_t const base,
size_t const size,
addr_t const req_base)
Io_mem_session_component::Map_local_result Io_mem_session_component::_map_local(addr_t, size_t)
{
return Dataspace_attr(size, 0, base, _cacheable, req_base);
return { .core_local_addr = 0, .success = true };
}

View File

@@ -22,9 +22,7 @@ using namespace Core;
void Io_mem_session_component::_unmap_local(addr_t, size_t, addr_t) { }
Io_mem_session_component::Dataspace_attr Io_mem_session_component::_map_local(addr_t const base,
size_t const size,
addr_t const req_base)
Io_mem_session_component::Map_local_result Io_mem_session_component::_map_local(addr_t, size_t)
{
return Dataspace_attr(size, 0, base, _cacheable, req_base);
return { .core_local_addr = 0, .success = true };
}

View File

@@ -56,9 +56,8 @@ static inline bool can_use_super_page(addr_t base, size_t size)
}
Io_mem_session_component::Dataspace_attr Io_mem_session_component::_map_local(addr_t const phys_base,
size_t const size_in,
addr_t const req_base)
Io_mem_session_component::Map_local_result Io_mem_session_component::_map_local(addr_t const phys_base,
size_t const size_in)
{
using namespace Pistachio;
@@ -85,7 +84,7 @@ Io_mem_session_component::Dataspace_attr Io_mem_session_component::_map_local(ad
addr_t const local_base = (addr_t)alloc_virt_range();
if (!local_base)
return Dataspace_attr ();
return Map_local_result ();
for (unsigned offset = 0; size; ) {
@@ -108,5 +107,5 @@ Io_mem_session_component::Dataspace_attr Io_mem_session_component::_map_local(ad
size -= page_size;
}
return Dataspace_attr(size_in, local_base, phys_base, _cacheable, req_base);
return { .core_local_addr = local_base, .success = true };
}

View File

@@ -98,9 +98,11 @@ struct Core::Untyped_memory
/**
* Create page frames from untyped memory
*/
static inline void convert_to_page_frames(addr_t phys_addr,
static inline bool convert_to_page_frames(addr_t phys_addr,
size_t num_pages)
{
auto const phys_addr_base = phys_addr;
for (size_t i = 0; i < num_pages; i++, phys_addr += get_page_size()) {
seL4_Untyped const service = untyped_sel(phys_addr).value();
@@ -121,14 +123,21 @@ struct Core::Untyped_memory
node_offset,
num_objects);
if (ret != seL4_NoError) {
error(__FUNCTION__, ": seL4_Untyped_RetypeAtOffset "
"returned ", ret, " - physical_range=",
Hex_range(node_offset << get_page_size_log2(),
(num_pages - i) * get_page_size()));
return;
}
if (ret == seL4_NoError)
continue;
error(__FUNCTION__, ": seL4_Untyped_RetypeAtOffset "
"returned ", ret, " - physical_range=",
Hex_range(node_offset << get_page_size_log2(),
(num_pages - i) * get_page_size()));
/* revert already converted memory */
convert_to_untyped_frames(phys_addr_base, get_page_size() * i);
return false;
}
return true;
}

View File

@@ -25,12 +25,11 @@ void Io_mem_session_component::_unmap_local(addr_t, size_t size, addr_t phys)
}
Io_mem_session_component::Dataspace_attr Io_mem_session_component::_map_local(addr_t const phys,
size_t const size,
addr_t const req_base)
Io_mem_session_component::Map_local_result Io_mem_session_component::_map_local(addr_t const phys,
size_t const size)
{
size_t const num_pages = size >> get_page_size_log2();
Untyped_memory::convert_to_page_frames(phys, num_pages);
return Dataspace_attr(size, 0, phys, _cacheable, req_base);
return { .core_local_addr = 0,
.success = Untyped_memory::convert_to_page_frames(phys, num_pages) };
}

View File

@@ -67,6 +67,12 @@ class Core::Io_mem_session_component : public Rpc_object<Io_mem_session>
cacheable(c), req_base(req_base) { }
};
struct Map_local_result
{
addr_t core_local_addr { 0 };
bool success { };
};
struct Io_dataspace_component : Dataspace_component
{
addr_t req_base;
@@ -105,7 +111,7 @@ class Core::Io_mem_session_component : public Rpc_object<Io_mem_session>
*
* Both parameters - base and size - must be page-aligned.
*/
Dataspace_attr _map_local(addr_t base, size_t size, addr_t req_base);
Map_local_result _map_local(addr_t base, size_t size);
/**

View File

@@ -75,7 +75,13 @@ Io_mem_session_component::_prepare_io_mem(const char *args,
}
/* request local mapping */
return _map_local(base, size, req_base);
auto const map_result = _map_local(base, size);
if (!map_result.success)
return Dataspace_attr();
return Dataspace_attr(size, map_result.core_local_addr, base, _cacheable,
req_base);
}