diff --git a/repos/base-nova/include/nova/syscall-generic.h b/repos/base-nova/include/nova/syscall-generic.h index b2b48e5e0..1d2714c65 100644 --- a/repos/base-nova/include/nova/syscall-generic.h +++ b/repos/base-nova/include/nova/syscall-generic.h @@ -540,7 +540,8 @@ namespace Nova { bool kern_pd = false, bool update_guest_pt = false, bool translate_map = false, - bool dma_mem = false) + bool dma_mem = false, + bool write_combined = false) { /* transfer items start at the end of the UTCB */ items += 1 << 16; @@ -556,16 +557,19 @@ namespace Nova { /* map from hypervisor or current pd */ unsigned h = kern_pd ? (1 << 11) : 0; + /* map write-combined */ + unsigned wc = write_combined ? (1 << 10) : 0; + /* update guest page table */ - unsigned g = update_guest_pt ? (1 << 10) : 0; + unsigned g = update_guest_pt ? (1 << 9) : 0; /* mark memory dma able */ - unsigned d = dma_mem ? (1 << 9) : 0; + unsigned d = dma_mem ? (1 << 8) : 0; /* set type of delegation, either 'map' or 'translate and map' */ unsigned m = translate_map ? 2 : 1; - item->hotspot = crd.hotspot(sel_hotspot) | g | h | d | m; + item->hotspot = crd.hotspot(sel_hotspot) | g | h | wc | d | m; item->crd = crd.value(); return true; diff --git a/repos/base-nova/ports/nova.hash b/repos/base-nova/ports/nova.hash index 97fc5d0e3..31ca3ddd7 100644 --- a/repos/base-nova/ports/nova.hash +++ b/repos/base-nova/ports/nova.hash @@ -1 +1 @@ -361b07cc4c3e43610e1bb772932597d45be69c28 +61ea642d86312acd24698976f79d4530132c05a2 diff --git a/repos/base-nova/ports/nova.port b/repos/base-nova/ports/nova.port index 87f924fe2..e52082cc3 100644 --- a/repos/base-nova/ports/nova.port +++ b/repos/base-nova/ports/nova.port @@ -4,7 +4,7 @@ DOWNLOADS := nova.git # r9 branch URL(nova) := https://github.com/alex-ab/NOVA.git -REV(nova) := 834519fa28b1f2fc46e3b10746b4838a19470c7a +REV(nova) := a4a926a749ecdce5ae04d16465aa1872bc626755 DIR(nova) := src/kernel/nova PATCHES := $(wildcard $(REP_DIR)/patches/*.patch) diff --git a/repos/base-nova/src/core/echo.cc b/repos/base-nova/src/core/echo.cc index e81945c81..83ede70e0 100644 --- a/repos/base-nova/src/core/echo.cc +++ b/repos/base-nova/src/core/echo.cc @@ -44,12 +44,13 @@ static void echo_reply() Nova::mword_t offset = echo()->utcb()->msg[1]; bool kern_pd = echo()->utcb()->msg[2]; bool dma_mem = echo()->utcb()->msg[3]; + bool write_combined = echo()->utcb()->msg[4]; /* reset message transfer descriptor */ echo()->utcb()->set_msg_word(0); /* append capability-range as message-transfer item */ bool res = echo()->utcb()->append_item(snd_rcv, offset, kern_pd, false, - false, dma_mem); + false, dma_mem, write_combined); /* set return code, 0 means failure */ echo()->utcb()->msg[0] = res; diff --git a/repos/base-nova/src/core/include/ipc_pager.h b/repos/base-nova/src/core/include/ipc_pager.h index 43d09998d..e71b81087 100644 --- a/repos/base-nova/src/core/include/ipc_pager.h +++ b/repos/base-nova/src/core/include/ipc_pager.h @@ -32,7 +32,7 @@ namespace Genode { addr_t _dst_addr; addr_t _core_local_addr; - bool _write_combined; + Cache_attribute _attr; size_t _size_log2; bool _rw; @@ -49,8 +49,7 @@ namespace Genode { bool rw = true) : _dst_addr(dst_addr), _core_local_addr(map_addr), - _write_combined(c != CACHED), _size_log2(size_log2), - _rw(rw) + _attr(c), _size_log2(size_log2), _rw(rw) { } /** @@ -67,7 +66,8 @@ namespace Genode { Nova::Rights(true, _rw, true)); } - bool write_combined() { return _write_combined; }; + bool dma() { return _attr != CACHED; }; + bool write_combined() { return _attr == WRITE_COMBINED; }; addr_t dst_addr() { return _dst_addr; } }; diff --git a/repos/base-nova/src/core/include/nova_util.h b/repos/base-nova/src/core/include/nova_util.h index a2af56819..4683ca8ba 100644 --- a/repos/base-nova/src/core/include/nova_util.h +++ b/repos/base-nova/src/core/include/nova_util.h @@ -64,7 +64,8 @@ inline Genode::addr_t boot_cpu() * from the echo EC to the calling EC. */ static int map_local(Nova::Utcb *utcb, Nova::Crd src_crd, Nova::Crd dst_crd, - bool kern_pd = false, bool dma_mem = false) + bool kern_pd = false, bool dma_mem = false, + bool write_combined = false) { /* open receive window at current EC */ utcb->crd_rcv = dst_crd; @@ -74,7 +75,8 @@ static int map_local(Nova::Utcb *utcb, Nova::Crd src_crd, Nova::Crd dst_crd, utcb->msg[1] = 0; utcb->msg[2] = kern_pd; utcb->msg[3] = dma_mem; - utcb->set_msg_word(4); + utcb->msg[4] = write_combined; + utcb->set_msg_word(5); /* establish the mapping via a portal traversal during reply phase */ Nova::uint8_t res = Nova::call(echo()->pt_sel()); @@ -131,7 +133,8 @@ inline int map_local(Nova::Utcb *utcb, Genode::addr_t from_start, Genode::addr_t to_start, Genode::size_t num_pages, Nova::Rights const &permission, - bool kern_pd = false, bool dma_mem = false) + bool kern_pd = false, bool dma_mem = false, + bool write_combined = false) { if (verbose_local_map) Genode::printf("::map_local: from %lx to %lx, %zd pages from kernel %u\n", @@ -173,7 +176,7 @@ inline int map_local(Nova::Utcb *utcb, int const res = map_local(utcb, Mem_crd((from_curr >> 12), order - get_page_size_log2(), permission), Mem_crd((to_curr >> 12), order - get_page_size_log2(), permission), - kern_pd, dma_mem); + kern_pd, dma_mem, write_combined); if (res) return res; /* advance offset by current flexpage size */ diff --git a/repos/base-nova/src/core/ipc_pager.cc b/repos/base-nova/src/core/ipc_pager.cc index 38bba8a32..83bdc858f 100644 --- a/repos/base-nova/src/core/ipc_pager.cc +++ b/repos/base-nova/src/core/ipc_pager.cc @@ -61,7 +61,7 @@ void Ipc_pager::set_reply_mapping(Mapping m) Nova::Utcb *utcb = (Nova::Utcb *)Thread_base::myself()->utcb(); utcb->set_msg_word(0); bool res = utcb->append_item(m.mem_crd(), m.dst_addr(), false, false, - false, m.write_combined()); + false, m.dma(), m.write_combined()); /* one item ever fits on the UTCB */ (void)res; }