diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim
index ea09b3400..3872ed360 100644
--- a/compiler/ccgexprs.nim
+++ b/compiler/ccgexprs.nim
@@ -1103,15 +1103,21 @@ proc genEcho(p: BProc, n: PNode) =
# echo directly to the Genode LOG session
var args: Rope = nil
var a: TLoc
- for it in n.sons:
+ for i, it in n.sons:
if it.skipConv.kind == nkNilLit:
args.add(", \"\"")
- else:
+ elif n.len != 0:
initLocExpr(p, it, a)
- args.add(ropecg(p.module, ", Genode::Cstring($1->data, $1->len)", [rdLoc(a)]))
+ if i > 0:
+ args.add(", ")
+ case detectStrVersion(p.module)
+ of 2:
+ args.add(ropecg(p.module, "Genode::Cstring($1.p->data, $1.len)", [a.rdLoc]))
+ else:
+ args.add(ropecg(p.module, "Genode::Cstring($1->data, $1->len)", [a.rdLoc]))
p.module.includeHeader("")
p.module.includeHeader("")
- linefmt(p, cpsStmts, """Genode::log(""$1);$n""", [args])
+ linefmt(p, cpsStmts, """Genode::log($1);$n""", [args])
else:
if n.len == 0:
linefmt(p, cpsStmts, "#echoBinSafe(NIM_NIL, $1);$n", [n.len])
diff --git a/compiler/cgen.nim b/compiler/cgen.nim
index 7dfab6a42..5d6de2a03 100644
--- a/compiler/cgen.nim
+++ b/compiler/cgen.nim
@@ -1418,7 +1418,7 @@ proc genMainProc(m: BModule) =
GenodeNimMain =
"extern Genode::Env *nim_runtime_env;$N" &
- "extern void nim_component_construct(Genode::Env*);$N$N" &
+ "extern \"C\" void nim_component_construct(Genode::Env*);$N$N" &
NimMainBody
ComponentConstruct =
diff --git a/config/nim.cfg b/config/nim.cfg
index 39e6c002b..d3ab75825 100644
--- a/config/nim.cfg
+++ b/config/nim.cfg
@@ -114,7 +114,7 @@ nimblepath="$home/.nimble/pkgs/"
clang.options.linker = "-Wl,--as-needed -lnetwork"
clang.cpp.options.linker = "-Wl,--as-needed -lnetwork"
tcc.options.linker = "-Wl,--as-needed -lnetwork"
- @else:
+ @elif not genode:
# -fopenmp
gcc.options.linker = "-ldl"
gcc.cpp.options.linker = "-ldl"
@@ -289,29 +289,6 @@ vcc.cpp.options.size = "/O1"
# Configuration for the Tiny C Compiler:
tcc.options.always = "-w"
-# Configuration for the Genode toolchain
-@if genode:
- noCppExceptions # avoid std C++
- tlsEmulation:on # no TLS segment register magic
- @if i386 or amd64:
- gcc.exe = "genode-x86-gcc"
- gcc.cpp.exe = "genode-x86-g++"
- gcc.cpp.linkerexe = "genode-x86-ld"
- @elif arm:
- gcc.exe = "genode-arm-gcc"
- gcc.cpp.exe = "genode-arm-g++"
- gcc.cpp.linkerexe = "genode-arm-ld"
- @elif arm64:
- gcc.exe = "genode-aarch64-gcc"
- gcc.cpp.exe = "genode-aarch64-g++"
- gcc.cpp.linkerexe = "genode-aarch64-ld"
- @elif riscv64:
- gcc.exe = "genode-riscv-gcc"
- gcc.cpp.exe = "genode-riscv-g++"
- gcc.cpp.linkerexe = "genode-riscv-ld"
- @end
-@end
-
@if arm or arm64:
--define:nimEmulateOverflowChecks
@end
diff --git a/lib/genode/alloc.nim b/lib/genode/alloc.nim
index a21a3ad7b..3ddd3074b 100644
--- a/lib/genode/alloc.nim
+++ b/lib/genode/alloc.nim
@@ -17,18 +17,18 @@ when not defined(genode):
when not declared(GenodeEnv):
include genode/env
-type DataspaceCapability {.
- importcpp: "Genode::Dataspace_capability", pure.} = object
+type RamDataspaceCapability {.
+ importcpp: "Genode::Ram_dataspace_capability", pure.} = object
type
Map = object
attachment: pointer
size: int
- ds: DataspaceCapability
+ ds: RamDataspaceCapability
SlabMeta = object
next: ptr MapSlab
- ds: DataspaceCapability
+ ds: RamDataspaceCapability
MapSlab = object
meta: SlabMeta
@@ -45,11 +45,11 @@ proc capsAvail(env: GenodeEnv): int {.
## Return the number of available capabilities.
## Each dataspace allocation consumes a capability.
-proc allocDataspace(env: GenodeEnv; size: int): DataspaceCapability {.
+proc allocDataspace(env: GenodeEnv; size: int): RamDataspaceCapability {.
importcpp: "#->pd().alloc(@)".}
## Allocate a dataspace and its capability.
-proc attachDataspace(env: GenodeEnv; ds: DataspaceCapability): pointer {.
+proc attachDataspace(env: GenodeEnv; ds: RamDataspaceCapability): pointer {.
importcpp: "#->rm().attach(@)".}
## Attach a dataspace into the component address-space.
@@ -57,7 +57,7 @@ proc detachAddress(env: GenodeEnv; p: pointer) {.
importcpp: "#->rm().detach(@)".}
## Detach a dataspace from the component address-space.
-proc freeDataspace(env: GenodeEnv; ds: DataspaceCapability) {.
+proc freeDataspace(env: GenodeEnv; ds: RamDataspaceCapability) {.
importcpp: "#->pd().free(@)".}
## Free a dataspace.
diff --git a/lib/genode_cpp/syslocks.h b/lib/genode_cpp/syslocks.h
index 8ba39abc2..c50180903 100644
--- a/lib/genode_cpp/syslocks.h
+++ b/lib/genode_cpp/syslocks.h
@@ -13,7 +13,7 @@
/* Genode includes */
#include
-#include
+#include
namespace Nim {
struct SysLock;
@@ -22,15 +22,14 @@ namespace Nim {
struct Nim::SysLock
{
- Genode::Lock _lock_a, _lock_b;
+ Genode::Mutex _mutex_a, _mutex_b;
bool _locked;
void acquireSys()
{
- _lock_a.lock();
+ Genode::Mutex::Guard guard(_mutex_a);
_locked = true;
- _lock_a.unlock();
- _lock_b.lock();
+ _mutex_b.acquire();
}
bool tryAcquireSys()
@@ -38,23 +37,22 @@ struct Nim::SysLock
if (_locked)
return false;
- _lock_a.lock();
+ Genode::Mutex::Guard guard(_mutex_a);
+
if (_locked) {
- _lock_a.unlock();
return false;
} else {
_locked = true;
- _lock_b.lock();
- _lock_a.unlock();
+ _mutex_b.acquire();
return true;
}
}
void releaseSys()
{
+ Genode::Mutex::Guard guard(_mutex_a);
_locked = false;
- _lock_a.unlock();
- _lock_b.unlock();
+ _mutex_b.release();
}
};
diff --git a/lib/pure/dynlib.nim b/lib/pure/dynlib.nim
index a1a94072c..3c1466322 100644
--- a/lib/pure/dynlib.nim
+++ b/lib/pure/dynlib.nim
@@ -150,6 +150,32 @@ elif defined(nintendoswitch):
proc symAddr(lib: LibHandle, name: cstring): pointer =
raise newException(OSError, "symAddr not implemented on Nintendo Switch!")
+elif defined(genode):
+ #
+ # =========================================================================
+ # Not implemented for Genode without POSIX. Raise an error if called.
+ # =========================================================================
+ #
+
+ template raiseErr(prc: string) =
+ raise newException(OSError, prc & " not implemented, compile with POSIX suport")
+
+ proc dlclose(lib: LibHandle) =
+ raiseErr(OSError, "dlclose")
+ proc dlopen(path: cstring, mode: int): LibHandle =
+ raiseErr(OSError, "dlopen")
+ proc dlsym(lib: LibHandle, name: cstring): pointer =
+ raiseErr(OSError, "dlsym")
+ proc loadLib(path: string, global_symbols = false): LibHandle =
+ raiseErr(OSError, "loadLib")
+ proc loadLib(): LibHandle =
+ raiseErr(OSError, "loadLib")
+ proc unloadLib(lib: LibHandle) =
+ raiseErr(OSError, "unloadLib")
+ proc symAddr(lib: LibHandle, name: cstring): pointer =
+ raiseErr(OSError, "symAddr")
+
+
elif defined(windows) or defined(dos):
#
# =======================================================================
diff --git a/lib/system/dyncalls.nim b/lib/system/dyncalls.nim
index b0f326bb5..c14fcf31e 100644
--- a/lib/system/dyncalls.nim
+++ b/lib/system/dyncalls.nim
@@ -167,14 +167,14 @@ elif defined(windows) or defined(dos):
elif defined(genode):
- proc nimUnloadLibrary(lib: LibHandle) {.
- error: "nimUnloadLibrary not implemented".}
+ proc nimUnloadLibrary(lib: LibHandle) =
+ raiseAssert("nimUnloadLibrary not implemented")
- proc nimLoadLibrary(path: string): LibHandle {.
- error: "nimLoadLibrary not implemented".}
+ proc nimLoadLibrary(path: string): LibHandle =
+ raiseAssert("nimLoadLibrary not implemented")
- proc nimGetProcAddr(lib: LibHandle, name: cstring): ProcAddr {.
- error: "nimGetProcAddr not implemented".}
+ proc nimGetProcAddr(lib: LibHandle, name: cstring): ProcAddr =
+ raiseAssert("nimGetProcAddr not implemented")
elif defined(nintendoswitch) or defined(freertos):
proc nimUnloadLibrary(lib: LibHandle) =