[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Minios-devel] Some considerations of ARM Unikraft supports



Hi Simon,

> -----Original Message-----
> From: Simon Kuenzer [mailto:simon.kuenzer@xxxxxxxxx]
> Sent: 2018年2月6日 0:21
> To: Wei Chen <Wei.Chen@xxxxxxx>; Julien Grall <julien.grall@xxxxxxxxxx>
> Cc: Felipe Huici <Felipe.Huici@xxxxxxxxx>; Kaly Xin <Kaly.Xin@xxxxxxx>; Shijie
> Huang <Shijie.Huang@xxxxxxx>; Florian Schmidt <Florian.Schmidt@xxxxxxxxx>;
> Costin Lupu <costin.lup@xxxxxxxxx>; nd <nd@xxxxxxx>; minios-
> devel@xxxxxxxxxxxxx
> Subject: Re: [Minios-devel] Some considerations of ARM Unikraft supports
> 
> Hi Wei, hi Julien,
> 
> thanks a lot for discussing this already, I put my comments inline.
> 
> On 05.02.2018 08:22, Wei Chen wrote:
> > Hi Julien,
> >
> > Thanks for your comments!
> > Replies inline.
> >
> >> -----Original Message-----
> >> From: Julien Grall [mailto:julien.grall@xxxxxxxxxx]
> >> Sent: 2018年2月2日 18:43
> >> To: Wei Chen <Wei.Chen@xxxxxxx>; Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> >> Cc: Felipe Huici <Felipe.Huici@xxxxxxxxx>; Kaly Xin <Kaly.Xin@xxxxxxx>;
> Shijie
> >> Huang <Shijie.Huang@xxxxxxx>; Florian Schmidt <Florian.Schmidt@xxxxxxxxx>;
> >> Costin Lupu <costin.lup@xxxxxxxxx>; nd <nd@xxxxxxx>; minios-
> >> devel@xxxxxxxxxxxxx
> >> Subject: Re: [Minios-devel] Some considerations of ARM Unikraft supports
> >>
> >> Hi,
> >>
> >> On 02/02/18 09:10, Wei Chen wrote:
> >>> This week I am trying to boot Unikraft on ARM64/KVM platform. In this
> >> progress I have
> >>> got some considerations and written a simple proposal:
> >>>
> >>> My first target is to enable Unikraft on ARM64+Kvm, so this proposal would
> >> focus on ARM64+Kvm.
> >>> But the goal of ARM support is to enable Unikraft on ARM32/ARM64 based
> >> hypervisors (ARM32/64 Kvm,
> >>> ARM64 Xen and etc). So we have to consider to keep current multi-arch
> >> framework and reuse common
> >>> code like virtual drivers for ARM32/ARM64.
> >>>
> >>> 1. Modify the folders for multi-architectures
> >>>       1.1. Add arm64 folder to unikraft/arch:
> >>>                unikraft----arch----arm
> >>>                              |-----x86_64
> >>>                              |-----arm64 <-- New
> >>>
> >>>            Above folders contains architecture specified Makefile, Config,
> >> Compiler flags and some
> >>>            code. In most cases, these files are exclusive. So we'd better
> >> keep each arcitecture in
> >>>            a standalone floder. This also can avoid doing to much changes
> to
> >> Unikraft Makefile.
> >>>
> >>>            If we add arm64 to unikraft/arch/arm, we have to do more ARCH
> >> comparasion in Makefile:
> >>>                unikraft----arch----arm----arm32
> >>>                          |      |-----arm64 <-- New
> >>>                        |
> >>>                          |-----x86_64
> >>>            Before:$(UK_BASE)/arch/$(ARCH)/Makefile.uk.
> >>>            After:$(UK_BASE)/arch/arm/$(ARCH)/Makefile.uk
> >>>            This change is complex, so we'd better to add arm64 folder to
> >> unikraft/arch.
> >>
> >> Except the assembly code, most of the C code should be very similar
> >> between ARM64 and ARM32. So it might make more sense to have a directory
> >> arch/arm with sub-folder arm32 and arm64.
> >>
> >
> > This is one option I had considered. But this will add a new variable
> (VENDOR) to
> > make scripts. e.g. :$(UK_BASE)/arch/$(VENDOR)/$(ARCH)/Makefile.uk
> > And currently, only architecture dependent code will be placed in $(ARCH)
> folder.
> > For example, in arm folder, there are some files for arm32 math library.
> These
> > files can only be used for arm32.
> 
> What is this vendor variable about? Is it something that applies to a
> specific silicon? Is it required to add subfolders for it?
> 

Yes, it applies to a specific silicon. But "VENDOR" is not very accurate here.
I had considered it again, because x86 is not a "VENDOR", and not all x86 chips
Belong to intel, Maybe use "FAMILY" is better.

If we really have some common C code for ARM32/64, I agree to add subfolders
for it.

unikraft----arch----arm----arm32  ARM family arm32 and arm64 architectures
             |       |-----arm64
             |
             |------x86----i386
                     |-----x86_64 X86 family i386 and x86_64 architectures

> >
> > If some C codes are very similar between arm32 and arm64, I think this code
> would
> > be very similar between arm and x86 too. We can place these codes in
> Unikraft/lib.
> >
> > Above 2 options would affect the common framework, so I still want to get
> some
> > Comments from Simon.
> 
> I welcome this discussion because one of the exercises of Unikraft's 0.2
> releases is to figure out how to do the right split.
> I am okay with changing the structure of the arch folder substructure if
> we can foresee already that it will make sense. In such a case, I would
> also like to adopt the same principle to the x86 architecture folder.
> 
> The idea of architecture libraries is that they contain code which is
> only special to the CPU but the same to all of the target platforms
> (xen, kvm, linux). We were originally expecting that this is mostly
> assembly code but we might be wrong with our original assumption. So, if
> you foresee any common C code for 32 and 64bit ARM that would be
> duplicated otherwise, we should use a single arm folder instead.
> 

Sorry, about " use a single arm folder instead". Does it mean we don't add
Any subfolders to arm or x86 folder? Like following?

unikraft----arch----arm
             |       
             |------x86
                     
> >
> >>>
> >>>       1.2. Add arm64 to unikraft/include/uk/arch
> >>>
> >>>       1.3. Add arm64 kvm platform code to unikraft/plat/kvm/arm, and use
> >> Makefile to select
> >>>            objects for correct architecutre:
> >>>
> >>>            ifeq ($(ARCH_X86_64),y)
> >>>               LIBKVMPLAT_SRCS-y += $(LIBKVMPLAT_BASE)/x86/entry64.S
> >>>               LIBKVMPLAT_SRCS-y += $(LIBKVMPLAT_BASE)/x86/cpu_x86_64.c
> >>>            else ifeq ($(ARCH_ARM_64),y)
> >>>               LIBKVMPLAT_SRCS-y += $(LIBKVMPLAT_BASE)/arm/entry64.S
> >>>               LIBKVMPLAT_SRCS-y += $(LIBKVMPLAT_BASE)/arm/cpu_arm64.c
> >>>            else ifeq ($(ARCH_ARM_64),y)
> >>>               LIBKVMPLAT_SRCS-y += $(LIBKVMPLAT_BASE)/arm/entry.S
> >>>               LIBKVMPLAT_SRCS-y += $(LIBKVMPLAT_BASE)/arm/cpu_arm.c
> >>>            endif
> >>>
> >>>       1.4. Add a "drivers" folder to unikraft/
> >>>            This because we may have some virtual device drivers can be
> shared
> >> among platforms.
> >>>            For example, we can reuse virtual uart, timer and gic drivers
> from
> >> arm32/arm64 Kvm/xen.
> 
> Is it okay for you to wait with the driver folder a bit? I am currently
> working on PCI for x86 KVM and I figured that Unikraft need an mechanism
> to select drivers for devices (and maybe buses) individually for each
> platform. But drivers are still something that depend on the platform.
> For instance Xen could reuse the same PCI drivers with pcifront, linux
> with VFIO, but a third platform might not support PCI at all.
> 
> Because of this, I am currently considering to introduce an folder in
> plat: e.g., plat/common/drivers/pci/virtio-net. What do you guys think?
> 

That's quite good, I will wait it : )

> >>>
> >>> 2. Bootloader
> >>>       2.1. Because of the BIOS, x86 is using multiboot to load kernel on
> >> Linux-KVM QEMU. But on ARM platforms,
> >>>            we can skip the EFI and boot from the Virtual Machine's RAM
> base
> >> address. So we can place _libkvmplat_entry
> >>>            to the CPU's reset entry by link script. On ARM64 platform, the
> >> default virtual machine CPU model is cortex A15.
> >>
> >> Cortex A15 does not support 64-bit. So how come it is the default
> >> virtual machine CPU model for ARM64?
> >>
> >
> >  From the code, if we don't specify any cpumodel, the mach-virt's default
> > cpumodel will be set to "cortex-a15". But you'are right, if we use cortex-15
> > by default, we can run any 64-bit image. Here is my mistake. We have to set
> > correct cpumodel (cortex-a53/a57 or host) in command line to make 64-bit
> image
> > work. But the mach-virt is still using the a15memmap and a15irqmap.
> >
> >
> >> But likely, you want to expose the same MIDR as the underlying CPU. So
> >> if an errata has to be implemented in Unikraft, it will be able to know it.
> >>
> >
> > Exposing the underlying CPU's MIDR to guest is depending on the hypervisors.
> > For Unikraft itself, it doesn't know whether this MIDR is the same as the
> underlying
> > CPU or not. And actually, no matter what cpumodel the hypervisor is
> emulating, the
> > code is running on the physical CPU directly. We don't emulate the CPU
> instructions.
> > If we run Unikraft on a corext-a53 host CPU, we can compile this image with
> gcc flags
> > like fix-a53-error.
> >
> >>>
> >>>            plat/kvm/arm/link64.ld:
> >>>            ENTRY(_libkvmplat_entry)
> >>>            SECTIONS {
> >>>                . = 0x40000000;
> >>>
> >>>                /* Code */
> >>>                _stext = .;
> >>>
> >>>                .text :
> >>>                {
> >>>                    *(.text)
> >>>                    *(.text.*)
> >>>                }
> >>>
> >>>                _etext = .;
> >>>                ...
> >>>            }
> >>>
> >>>       2.2. Use the fixed physical addresses of PL011 uart, timer and GIC.
> So
> >> we can skip the device tree parse.
> >>
> >> What does promise you the PL011, timer, GIC will always be at the same
> >> address?
> >
> > My original idea was that we selected a fixed machine (mach-virt) for
> Unikraft to run.
> > In this case, the memory map is fixed.
> >
> >> Or do you expect the user to hack unikraft build system to set
> >> the address?
> >>
> >
> > For my opinion, Yes. Why should we need to parse the device tree to increase
> our boot
> > time and footprint?
> >
> 
> Sorry for my stupid question: Would this hardcode the guest device
> configuration that you would need to set with KVM? I mean, how are
> network devices (or other) are handover to the guest? If yes, I am
> concerned that Unikraft is getting difficult to use on ARM. I would
> rather prefer to provide a configuration option where users could
> disable that the image scans the device tree and expects devices at
> hardcoded places.

While I was writing this proposal, I hadn't consider so many devices. I just
considered some platform devices like interrupt controller, timer and UART.
At that moment, I prefer to hardcode. But now I think parse the device tree
is better. Because the virtual net/block devices are dynamic configuration
for a VM.

> 
> >> At least from Xen PoV, the memory layout is not part of the ABI and a
> >> guest should rely on the DT for getting the correct addresses.
> >>
> >
> > I understand your concern. It's not a part of the ABI. So the addresses can
> be changed
> > for different boards.
> >
> > I think we must do a tradeoff between flexibility and deploy density (boot
> time and footprint)
> >
> 
> If this makes sense for you: I prefer having the most flexible as
> default and provide configuration options with Config.uk to switch them
> off individually. I think Unikraft should handover such tradeoff
> question to Unikernel builders.
> 

That would be good.

> >>>       2.3. Setup exception traps.
> >>>
> >>> 3. Support single CPU.
> 
> This is fine for the first version. The other platforms also just
> support a single CPU for now.
> 
> >>>
> >>> 4. Support multiple threads.
> >>>       4.1. Implement GIC interrupt controller drivers. If we doesn't
> specify
> >> the gic version in QEMU's parameter,
> >>>            default GIC will be detected by kvm_arm_vgic_probe. Most ARM
> hosts
> >> are using GICv2, GICv3 and GICv4,
> >>>            and QEMU will provide GICv2 and GICv3 emulators. For best
> >> compatibility, we have to implement gicv2
> >>>            and gicv3 drivers without MSI/MSI-X support. This means we
> don't
> >> need to implement gicv2m, gicv3-its
> >>>            for Unikraft in this time.
> >>>       4.2. Implment ARMv8 virtual timer driver.
> >>>
> 
> Please contact Costin what is required from the Unikraft's scheduler
> API. I CC'ed him.
> 

Thanks, I will contact Costin when I start to implement this driver.

> >>> 5. Setup a 1:1 mapping pagetable for Physical memory and Virtual memory.
> >>>       5.1. Configure MMU
> >>>       5.2. Create page tables with 1GB or 2MB block
> >>>
> 
> Good.
> 
> >>> 6. Implement PSCI interface to support machine shutdown.
> >>
> >> FWIW, system_off only exist from PSCI 0.2 and onwards.
> >>
> >
> > It seem the psci-0.2 is the default PSCI version of mach-virt with KVM.
> >
> >>>
> >>> 7. Network, block and etc IO devices?
> >>>      Should we have to port virtual device driver like virtio-net, pv-net
> >> from KVM and Xen?
> 
> After we agreed how Unikraft should include drivers we can start with
> porting them. Is KVM on ARM using virtio-net, too? Is there a virtual
> PCI bus attached?

Yes, KVM on ARM is using virtio-net too. The virtio-net is connect to a
virtio-mmio bus. But there is a ECAM PCI host controller emulator too.

> 
> >>
> >> There are no emulation provided on Xen, so you would need PV drivers to
> >> get access to the network/block.
> 
> This is fine ;-).
> 
> >
> > Yes, I have the same opinion with you 😊
> >
> >
> >>
> >> Cheers,
> >>
> >> --
> >> Julien Grall
> 
> Thanks,
> 
> Simon
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.