Hi, I'm moving from release 15.11 to 16.05 on base-hw and am having a "service denied" issue when trying to get a connection to a custom service I created to handle pin muxing on TI Sitara processors. In this family of processors, access to a "Control Module" is need to enable subsystems, set up clock frequencies, and set the mode for gpio pins which have multiple functions dependent upon the mode they are set to. Write access to the Control Module is only allowed in a privileged mode so I had to create custom kernel calls to access the appropriate SoC registers. I did this in release 14.05 by adding the code for unrestricted kernel calls to base-hw and it has been working without issue through various releases until I stared to move to 16.05.
The log output I'm getting is: Starting kernel ...
kernel initialized Genode 16.05 <local changes> int main(): --- create local services --- int main(): --- start init --- int main(): transferred 503 MB to init int main(): --- init created, waiting for exit condition --- [init] Could not open ROM session for module "ld.lib.so" [init -> ctrl_module] ---437x Control Module Server : Setting Pin Muxes--- [init -> ctrl_module] pin mux capability [init -> timer] Maximum timeout 1717986000 us [init -> timer] --- am437x timer driver --- [init -> 437x_platform_client] --- 437x platform being configured -- [init -> ctrl_module] Uncaught exception of type 'Genode::Parent::Service_denied' [init -> ctrl_module] Warning: abort called - thread: ep [init] virtual void Genode::Child_policy::exit(int): child "ctrl_module" exited w ith exit value 1 [init -> 437x_platform_client] Enabled dmtimer 3 freq = 1 [init -> 437x_platform_client] Enabled dmtimer 4 freq = 1 ....(other messages unrelated to the issue follow)
The uncaught exception is being generated in my "pinmux_session" connection code when a capability for a session is requested, as shown the following in the following code snippet from pinmux_connection.h
namespace Genode { struct Pinmux_connection; }
struct Genode::Pinmux_connection : Connection<Pinmux_session>, Pinmux_session_client { /** * Issue session request * * \noapi */ Capability<Pinmux_session> _session(Parent &parent, char const *label, long priority, unsigned long affinity) { Genode::printf("pin mux capability\n"); return***/session(parent,/**/ /**/ "priority=0x%lx, affinity=0x%lx, ram_quota=16K, label="%s"",/**/ /**/ priority, affinity, label); (exception occurs here)/* }
/** * Constructor * * \param label initial session label * \param priority designated priority of the Pinmux * \param affinity which physical CPU the VM should run on top of */ Pinmux_connection(Genode::Env &env, const char *label = "", long priority = Cpu_session::DEFAULT_PRIORITY, unsigned long affinity = 0) : Connection<Pinmux_session>( env, _session(env.parent(), label, priority, affinity)), Pinmux_session_client(cap()) { }
/** * Constructor * * \noapi * \deprecated Use the constructor with 'Env &' as first * argument instead */ Pinmux_connection(const char *label = "", long priority = Cpu_session::DEFAULT_PRIORITY, unsigned long affinity = 0) : Connection<Pinmux_session>(_session(*env()->parent(), label, priority, affinity)), Pinmux_session_client(cap()) { Genode::printf("ctrl mod connection\n");} };
This code differs from the 15.11 code in that the request for a session now requires a "parent" argument in 16.05. Looking at similar kernel call codes like the vm calls, my changes to my custom calls for 16.05 appear to be correct.
I can see in the kernel code (parent.h) where the exception is occurring but I have no clue as to why it occurs. Any hints would be greatly appreciated.
Thanks,
Bob Stewart