mirror of
https://github.com/mmueller41/genode.git
synced 2026-01-21 12:32:56 +01:00
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:
committed by
Norman Feske
parent
2b566042ad
commit
7c5f879b91
@@ -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();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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(); });
|
||||
}
|
||||
|
||||
@@ -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 };
|
||||
}
|
||||
|
||||
@@ -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 };
|
||||
}
|
||||
|
||||
@@ -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 };
|
||||
}
|
||||
|
||||
@@ -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 };
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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) };
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user