Logging to fbterminal (was Re: Building programs with MODE=shared in L4Re)

Paul Boddie paul at boddie.org.uk
Sat May 19 23:16:25 CEST 2018


On Monday 14. May 2018 22.06.06 Paul Boddie wrote:
> On Monday 14. May 2018 21.18.04 Adam Lackorzynski wrote:
> > You can set LD_DEBUG=1 in the environment of your program to make the
> > dynamic loader tell you something. LD_TRACE_LOADED_OBJECTS=1 might also
> > be of help. Add enviroment variable settings after the program's
> > cmdline: ...:start({ ...}, "rom/myprog arg", { LD_DEBUG=1, ... });
> 
> I imagine I could direct log information to a suitable program for display
> on the screen rather than via the serial console. Can I do this using
> something like fbterminal? I'm still getting to grips with the different
> mechanisms accessed and exposed by the different programs.

Maybe the matter of configuring fbterminal as a logging destination is obvious 
to those better acquainted with L4Re, but I eventually figured it out in a 
way. What I needed to do is to provide a different "log" capability to the 
hello program, but this is perhaps easier said than done.

According to the documentation...

http://l4re.org/doc/l4re_servers_ned.html#l4re_ned_startup

...it is supposed to be possible to indicate a log factory that creates a 
suitable object using the "log_fab" property/attribute of the loader.

Looking at the Lua code (pkg/l4re-core/ned/server/src/ned.lua), the 
App_env:log function seems to be the thing that gets called, returning the 
desired capability:

return self.loader.log_fab:create(Proto.Log, table.unpack(self.log_args));

While, I guess I might make a suitable loader available with code that looks 
like this...

local l2 = L4.Loader.new({loader = l, log_fab = term});

...and then use it to start the hello program...

l2:start({
    log = { "hello", "b" },
  },
  "rom/hello");

...the challenge is to specify something that can *create* the logging 
destination. In my .cfg script, "term" is actually the IPC gate (or "channel") 
capability exposing the fbterminal:

local term = l:new_channel();

l:start({
    caps = {
      fb = mag_caps.svc:create(L4.Proto.Goos, "g=800x460+0+0",
                               "barheight=20"),
      term = term:svr(),
    },
  },
  "rom/fbterminal");

So, as far as I can see, I would need something that acts as a factory capable 
of providing a fbterminal capability when its create method is invoked 
(specifying the log protocol). This seems like a lot of effort.

It then occurred to me that I only really want a way of presenting the "term" 
capability to the hello program. Since this isn't obviously possible in the 
loader, I modified the App_env:log function to support an additional case:

  if self.log_cap then
    return self.log_cap
  elseif self.loader.log_fab == nil or self.loader.log_fab.create == nil then
    error ("Starting an application without valid log factory", 4);
  end

Thus, if "log_cap" is indicated when starting a program, it just uses this 
instead of trying to conjure up another capability. So the hello program is 
started as follows:

l:start({
    log_cap = term,
  },
  "rom/hello");

This manages to log to fbterminal, much to my relief. I hope this helps anyone 
else who struggled with this or just wondered about it.

Paul




More information about the l4-hackers mailing list