[Thanks again for your timeley responses, more inline] On Sun, Mar 27, 2022 at 6:11 PM Kent Mcleod <kent.mcleo...@gmail.com> wrote:
> On Mon, Mar 28, 2022 at 11:04 AM Sam Leffler <sleff...@google.com> wrote: > > > > On Sun, Mar 27, 2022 at 3:43 PM Kent Mcleod <kent.mcleo...@gmail.com> > wrote: > >> > >> On Mon, Mar 28, 2022 at 6:29 AM Sam Leffler via Devel > >> <devel@sel4.systems> wrote: > >> > > >> > The rootserver gets various caps setup for it by the kernel (see > Table 9.1 > >> > in the manual). This includes the gobal ASID, IRQ, Domain, and Sched > >> > controllers. I need these caps in a process created by the > rootserver. This > >> > is within a CAmkES environment. So far I've created CAmkES component > >> > attributes that signal the rootserver should hand-off a cap by moving > the > >> > rootserver's cap to the designated CNode just before it terminates. > This > >> > involves modifications to CAmkES, capDL, and the rootserver. Is there > a > >> > better way? Is there an existing example of doing this? Are any of > these > >> > global objects accessible some other way than hand-off from the > rootserver? > >> > > >> > >> CapDL and the capdl-loader-app should already be able to move these > >> caps without extra modifications. They exist in the spec: > >> > https://github.com/seL4/capdl/blob/master/capDL-tool/CapDL/Model.hs#L376-L386 > >> > >> The "interrupts" tutorial > >> (https://docs.sel4.systems/Tutorials/interrupts.html) works by having > >> the irq_control cap moved into one of the component CNodes. The capdl > >> spec fragment that does this is: > >> ``` > >> cnode_timer { > >> // ... > >> 0x8: irq_control > >> } > >> ``` > >> Note that this tutorial isn't CAmkES but uses a CapDL spec and the > >> rootserver to set up the tutorial apps. > >> > >> > >> Within camkes, I'm not immediately aware of any public examples that > >> use any of these caps. There's one template that does appear to > >> support moving a sched_control cap to a component: > >> > https://github.com/seL4/camkes-tool/blob/271d6a2405d571272b252fcf308e7581cdd6a1a1/camkes/templates/component.simple.c#L32-L36 > >> A custom CAmkES template could be added which would work for any of > >> the special caps you mentioned as they are all defined in the library > >> camkes uses to generate specs: > >> > https://github.com/seL4/capdl/blob/master/python-capdl-tool/capdl/Object.py#L84-L92 > > > > > > Very nice. This looks to eliminate many of my mods. Some questions: > > 1. I've been handing off the ASDIPool object at > seL4_CapInitThreadASIDPool but following your suggestions appears to create > a new ASDIPool instead of passing along the rootserver's. My template > snippet is: > > > > /*- if configuration[me.name].get('asid_pool', False) -*/ > > /*- set asid_pool = alloc('asid_pool', type=seL4_ASID_Pool, > core=configuration[me.name].get('domain_ctrl')) -*/ > > const seL4_CPtr ASID_POOL = /*? asid_pool ?*/; > > /*- endif -*/ > > > > (I blindly copied the core setting, looks like it may be ignored). IIUC > I may be able to have multiple asid pools (depending on the arch) and that > may be preferred but for now I was intending to assign all my vspace roots > to the same pool. Is that happening? (I'm just going off what I see in > system.cdl & capdl_spec.c). If I am getting a new ASID pool is there any > way to express that I want seL4_CapInitThreadASIDPoo and not a new object? > > I was assuming you wanted the seL4_CapASIDControl cap. I don't think > there is a way to move/copy the seL4_CapInitThreadASIDPool cap without > teaching the CapDL spec and rootserver about it. I don't think that > would be an uncontroversial change. Having multiple ASID pools > shouldn't be an issue (unless you're extremely space constrained as > each one is 4k). Having more ASID pools allows you to have slightly > better isolation between untrusted components if they don't share an > ASID pool but are able to dynamically assign/unassign vspaces to an > ASID pool object because of the ASID-reuse caveat: > > https://github.com/seL4/seL4/blob/master/CAVEATS-generic.md#re-using-address-spaces-arm-and-x86 > (this does also apply to RISCV). > Ok. The manual seemed to indicate support for multiple asid pools was arch-dependent so I was just going to re-use the existing one. Now I know how to do it either way, thank you! > > > > > 2. UntypedMemory. My first foray down this path was to hand-off the > UntypedMemory objects. Can I use similar techniques to make this happen w/o > mods to signal the rootserver to DTRT. Seems more difficult given this > comes via BootInfo and requires moving an unknown (at compile-time) # of > UntypedMemory caps. My current scheme moves the untypeds and also passes > along a page with an updated version of BootInfo to identify the set of > caps for the UntypedMemory objects. > > > > I believe the only existing way you could do this is by naming the > exact untypeds in the spec, by providing a physical address. As you > say, this is hard to do if you don't know ahead of time what the > bootinfo is going to contain (you can precalculate it though if you > know the size of the rootserver and kernel images). It still seems > that the way forward here is to have some sort of builtin way of > parameterizing the spec to describe how the loader can move remainder > UT objects into a range of slots and also fill in a frame with the > book keeping information. > I plumbed an attribute for a CNode that means "move the untypeds here", then added a new FillFrame_BootInfo token to signal the rootserver fill-in the frame contents with updated info. This gives me what I want but required hacking things through capDL. The destination CNode needs to be sized big enough to hold the untypeds which is fragile but was gonna revisit that later. > > > > 3. While I'm getting a lesson in CAmkES templates + capDL, is there a > way to arrange to allocate a FrameObject and install the cap to it in > "my_cnode" (or somewhere else that I can access to unmap the page so I have > just page-size gap in the vspace)? This is for temporarily mapping pages to > write their contents (as the rootserver does when constructing a > component's vspace contents). I've got something ugly that seems to DTRT > but would love to "do it right". > > > > The mechanisms do exist. The seL4HardwareMMIO template > ( > https://github.com/seL4/camkes-tool/blob/master/camkes/templates/seL4HardwareMMIO.template.c#L52 > ) > is an example where the mapping caps are moved into the CSpace of the > component. The magic is encapsulated in the register_shared_variable() > implementation which has to call `cap.set_mapping_deferred()` on each > frame cap and add the list of caps to an address space allocator with > `addr_space.add_symbol_with_caps(symbol, sizes, caps)` to defer > assigning the CNode slot it's placed in until the VSpace is created > for the component. This generates a spec where the cap containing the > VSpace mapping is moved into a specified CNode slot so that the > mapping can be unmapped. > Ok. I found register_shared_variable but couldn't make it do what I wanted. Hopefully your hints will get me over the hump. > > >> > >> > >> The loader moves these special caps in a final move phase after all > >> other caps have been created so that they are moved after any caps > >> have already been derived from them. > >> > >> These global objects can't be copied or created and so the only way > >> for them to get given to a new CSpace is for them or a CNode that > >> they're stored in to be moved to the target CSpace. > >> > >> > >> > >> > > >> > -Sam > >> > _______________________________________________ > >> > Devel mailing list -- devel@sel4.systems > >> > To unsubscribe send an email to devel-leave@sel4.systems > _______________________________________________ Devel mailing list -- devel@sel4.systems To unsubscribe send an email to devel-leave@sel4.systems