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

Paul Boddie <[email protected]>
Newsgroups gmane.comp.micro-kernel.l4.devel
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.