Genode platform fixes (#17521)
* Genode: move dyncall failures to runtime Do not use the "error" pragma to warn that dynamic library loading is not implemented, print a message at runtime and exit. * Genode: use stricter dataspace type in page allocator * Genode: remove compiler configuration from nim.cfg Self-hosting Nim is not supported on Genode and defining the cross-compilation environment can be done externally. * Genode: use new mutex API * Genode: call nim_component_construct as a C procedure * Genode: implement echo for NimStringV2
This commit is contained in:
parent
86a1dcf928
commit
8aa5991bea
7 changed files with 60 additions and 53 deletions
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
/* Genode includes */
|
||||
#include <base/semaphore.h>
|
||||
#include <base/lock.h>
|
||||
#include <base/mutex.h>
|
||||
|
||||
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();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
#
|
||||
# =======================================================================
|
||||
|
|
|
|||
|
|
@ -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) =
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue