Hi,I attempted to implement a read-only method to share a variable of Core.My attempt showed me an error as follows:Error: init -> tz_vmm -> ep: raised unhandled data abort DFSR=0x1008 ISFR=0x7 DFAR=0xc000 ip=0x70010c40 sp=0xe02fef00My implementation is as follows(blue-colored parts):1) Core(repos/base/src/core/main.cc) static unsigned char core_data[32]; /* data I'd like to share */int main(){...Pd_connection init_pd("init");Core_child *init = new (env()->heap())Core_child(Rom_session_client(init_rom_session_cap).dataspac e(), init_pd, init_ram_session_cap, init_cpu.cap(),local_services);/* allocate dataspace used for creating shared memory between core and init */342 Dataspace_capability ds = env()->ram_session()->alloc(4096); 343 void* local_addr = env()->rm_session()->attach(ds); 344 Genode::printf("local_addr=0x%p\n", local_addr); 345 Genode::memcpy((void*)local_addr, (const void*) core_data, 32); 346347 /* add to ROM FS */348 Rom_module *rom_module = new (platform()->core_mem_alloc())349 Rom_module((addr_t)local_addr, 4096, "core_data"); 350 platform()->rom_fs()->insert(rom_module); 351platform()->wait_for_exit();...}2) tz_vmm(repos/os/src/server/tz_vmm/spec/imx53/main.cc) int main(){149 /* obtain core_data */150 Dataspace_capability ds;151 try{152 static Genode::Rom_connection rom("core_data");153 ds = rom.dataspace();154 }catch(...){155 error("ROM module \"core_data\" not present");}156157 void* core_data =158 (void*) Genode::env()->rm_session()->attach(ds); 159 Genode::size_t size = Genode::Dataspace_client(ds).size(); 160 static unsigned char local_data[32];161 Genode::memcpy((void*)local_data, (const void*)core_data, size); /* data abort happens here */162 Genode::env()->rm_session()->detach(measurement); static Vm vm("linux", cmdline_tablet,Trustzone::NONSECURE_RAM_BASE, Trustzone::NONSECURE_RAM_SIZE, KERNEL_OFFSET, MACH_TYPE_QSB);static Vmm::Vmm vmm(&vm);...}Is there any comment on my implementation?Any comment comments would be highly appreciated.JaeminParkOn Fri, Feb 2, 2018 at 9:49 PM, Jaemin Park <jmpark81@...9...> wrote:Hi,I really appreciate your kind and quick response.In my case, a one-way read-only fashion is enough.I'd like to share an information that other components can read only.If you can give me an example or any reference code published in the git repository, please let me know.Sorry for a newbie's request.JaeminParkOn Fri, Feb 2, 2018 at 6:27 PM, Stefan Kalkowski <stefan.kalkowski@...471...com > wrote:Hi Jaemin,
On Fri, Feb 02, 2018 at 11:28:53AM +0900, Jaemin Park wrote:
> Hi,
>
> I'd like to ask a question about a way to "share a variable of Core with
> other components".
>
> I'm using i.MX53 QSB, so this question is based on 'base-hw' implementation.
>
> Suppose that 'Core' has a variable "A" and makes it visible to other
> components like 'Init' or else.
>
> For this, I added a routine to use a Dataspace_capability for "A" in main()
> of 'Core' as follows:
> *[repos/base/src/core/main.cc]*
> *Dataspace_capability ds = env()->ram_session()->alloc(4096);*
> *unsigned char *local_addr = env()->rm_session()->attach(ds);*
>
> However, I faced a difficulty to implement an RPC to delegate(share) the
> Dataspace_capability to other components.
>
> Is there any simple or proper way to share "A" of 'Core' with other
> components?
> If possible, please give me an example.
Well, in general there are only few examples where core 'shares'
memory with other components. Due to core being the security critical
kernel component, it is a bad idea to widen the interface to it too
much. Apart from this disclaimer, there are some information needed to
be exported from core to specific components, e.g., platform
information like ACPI etc. from the booting infrastructure exported to
the platform driver. Those information are shared in a one-way
read-only fashion. Therefore, it is enough to create a dataspace
within core, and export it as a ROM module using a dedicated name for
it. The user-level component can open that dataspace using the normal
ROM session interface of core.
If you want to share information bi-directional this approach
obviously is no way. On the other hand it is not recommended at all to
import data into the kernel beyond the existing system calls.
An exception is the VM session interface of base-hw's core, which
exports a dataspace to the VMM component used to reflect the machine
register set of the VM under control of the VMM. Those register
contents can be altered by the VMM, e.g., after doing some device
emulation, and is taken by the kernel to reload the registers when
switching to the VM again. Of course, when sharing data in such a way
both sides need to synchronize before accessing the shared data.
Because core/kernel cannot block on any user-level component, signals
are used to hint the VMM about a change of the VM state, whereby the
VMM calls core via IPC (VM session interface) to mark that the VM
state handling has finished, and the VM is re-runnable.
I hope this clarifies your question. If not you may explain your
use-case in more details.
Best regards
Stefan
>
> Any comment comments would be highly appreciated.
>
> JaeminPark
> ------------------------------------------------------------ ------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> genode-main mailing list
> genode-main@...172...net
> https://lists.sourceforge.net/lists/listinfo/genode-main
--
Stefan Kalkowski
Genode labs
https://github.com.skalk | https://genode.org
------------------------------------------------------------ ------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
genode-main mailing list
genode-main@...172...net
https://lists.sourceforge.net/lists/listinfo/genode-main