On 15/09/17 19:22, Jan Kiszka wrote:
> On 2017-09-13 16:29, Ralf Ramsauer wrote:
>> This demo starts a secondary CPU, ans sends SGIs between two CPUs back
> 
> s/ans/and/
> 
>> and forth. After some rounds of playing ping-pong, the secondary CPU is
>> shut down again.
>>
>> Signed-off-by: Ralf Ramsauer <[email protected]>
>> ---
>>  inmates/demos/arm/Makefile    |   3 +-
>>  inmates/demos/arm/psci-demo.c | 125 
>> ++++++++++++++++++++++++++++++++++++++++++
>>  inmates/demos/arm64/Makefile  |   3 +-
>>  3 files changed, 129 insertions(+), 2 deletions(-)
>>  create mode 100644 inmates/demos/arm/psci-demo.c
>>
>> diff --git a/inmates/demos/arm/Makefile b/inmates/demos/arm/Makefile
>> index b0fda4ed..5d0f9b5b 100644
>> --- a/inmates/demos/arm/Makefile
>> +++ b/inmates/demos/arm/Makefile
>> @@ -12,9 +12,10 @@
>>  
>>  include $(INMATES_LIB)/Makefile.lib
>>  
>> -INMATES := gic-demo.bin uart-demo.bin
>> +INMATES := gic-demo.bin uart-demo.bin psci-demo.bin
>>  
>>  gic-demo-y  := gic-demo.o
>>  uart-demo-y := uart-demo.o
>> +psci-demo-y := psci-demo.o
>>  
>>  $(eval $(call DECLARE_TARGETS,$(INMATES)))
>> diff --git a/inmates/demos/arm/psci-demo.c b/inmates/demos/arm/psci-demo.c
>> new file mode 100644
>> index 00000000..6637028c
>> --- /dev/null
>> +++ b/inmates/demos/arm/psci-demo.c
>> @@ -0,0 +1,125 @@
>> +/*
>> + * Jailhouse, a Linux-based partitioning hypervisor
>> + *
>> + * Copyright (c) OTH Regensburg, 2017
>> + *
>> + * Authors:
>> + *  Ralf Ramsauer <[email protected]>
>> + *
>> + * This work is licensed under the terms of the GNU GPL, version 2.  See
>> + * the COPYING file in the top-level directory.
>> + *
>> + * Alternatively, you can use or redistribute this file under the following
>> + * BSD license:
>> + *
>> + * Redistribution and use in source and binary forms, with or without
>> + * modification, are permitted provided that the following conditions
>> + * are met:
>> + *
>> + * 1. Redistributions of source code must retain the above copyright
>> + *    notice, this list of conditions and the following disclaimer.
>> + *
>> + * 2. Redistributions in binary form must reproduce the above copyright
>> + *    notice, this list of conditions and the following disclaimer in the
>> + *    documentation and/or other materials provided with the distribution.
>> + *
>> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 
>> IS"
>> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
>> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
>> PURPOSE
>> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
>> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
>> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
>> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
>> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
>> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
>> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
>> + * THE POSSIBILITY OF SUCH DAMAGE.
>> + */
>> +
>> +#include <mach.h>
>> +#include <inmate.h>
>> +#include <gic.h>
>> +#include <psci.h>
>> +
>> +#ifdef CONFIG_BARE_METAL
>> +#define PRIMARY_CPU   0
>> +#define SECONDARY_CPU 1
>> +#else
>> +#define PRIMARY_CPU   2
>> +#define SECONDARY_CPU 3
>> +#endif
>> +
>> +#define SGI 5
>> +
>> +#define SGI_ISSUE_OTHER_CPUS() gic_issue_sgi(1, 0, SGI)
>> +
>> +#if 0
>> +#define SGI_ISSUE_A() SGI_ISSUE_OTHER_CPUS()
>> +#define SGI_ISSUE_B() SGI_ISSUE_OTHER_CPUS()
>> +#else
> 
> What is the purpose of this dead code?
You can switch between different routing modes or test them.

I could either provide no selection, or encode it as cmdline argument.

Thanks for your review, will address remarks.
  Ralf
> 
>> +#define SGI_ISSUE_A() gic_issue_sgi(0, 1 << PRIMARY_CPU, SGI)
>> +#define SGI_ISSUE_B() gic_issue_sgi(0, 1 << SECONDARY_CPU, SGI)
>> +#endif
>> +
>> +static void handle_IRQ(unsigned int irqn)
>> +{
>> +    static unsigned int ctr = 0;
>> +    unsigned int my_cpu, request_cpu, sgi;
>> +
>> +    if (!is_sgi(irqn))
>> +            return;
>> +
>> +    sgi = sgi_id(irqn);
>> +    if (sgi != SGI)
>> +            return;
>> +
>> +    request_cpu = sgi_requesting_cpu(irqn);
>> +    my_cpu = cpu_id();
>> +
>> +    printk("SGI %u on CPU %u from CPU %u\n", sgi, my_cpu, request_cpu);
>> +
>> +    if (ctr == 100)
>> +            return;
>> +
>> +    if (++ctr == 100) {
>> +            printk("Offlining CPU %d\n", my_cpu);
>> +            psci_cpu_off();
>> +    }
>> +
>> +    if (my_cpu == PRIMARY_CPU)
>> +            SGI_ISSUE_B();
>> +    else if (my_cpu == SECONDARY_CPU)
>> +            SGI_ISSUE_A();
>> +    else
>> +            printk("Interrupt on unknown CPU!\n");
>> +}
>> +
>> +static void __attribute__((noreturn)) secondary_start(void *irq_stack)
>> +{
>> +    unsigned int id = cpu_id();
> 
> Blank line here, please.
> 
>> +    printk("Hello world from CPU %d\n", id);
>> +    gic_setup(handle_IRQ, irq_stack);
>> +
>> +    printk("Sending first SGI from CPU %d to CPU %d...\n", id, PRIMARY_CPU);
>> +    SGI_ISSUE_A();
>> +
>> +    while(1)
>> +            asm volatile("wfi");
>> +}
>> +
>> +void inmate_main(void *irq_stack)
>> +{
>> +    unsigned long res;
>> +
>> +    printk("Starting on processor %u...\n", cpu_id());
>> +    printk("PSCI version: %x\n", psci_version());
>> +    printk("Initializing the GIC...\n");
>> +    gic_setup(handle_IRQ, irq_stack);
>> +    printk("Starting secondary CPU %d via PSCI...\n", SECONDARY_CPU);
>> +    res = psci_cpu_on(SECONDARY_CPU, secondary_start);
>> +    if (res)
>> +            printk("Unable to start CPU %u: %d\n", SECONDARY_CPU, res);
>> +
>> +    while (1)
>> +            asm volatile("wfi");
>> +}
>> diff --git a/inmates/demos/arm64/Makefile b/inmates/demos/arm64/Makefile
>> index 49abe09b..e2527554 100644
>> --- a/inmates/demos/arm64/Makefile
>> +++ b/inmates/demos/arm64/Makefile
>> @@ -12,9 +12,10 @@
>>  
>>  include $(INMATES_LIB)/Makefile.lib
>>  
>> -INMATES := gic-demo.bin uart-demo.bin
>> +INMATES := gic-demo.bin psci-demo.bin uart-demo.bin
>>  
>>  gic-demo-y  := ../arm/gic-demo.o
>> +psci-demo-y := ../arm/psci-demo.o
>>  uart-demo-y := ../arm/uart-demo.o
>>  
>>  $(eval $(call DECLARE_TARGETS,$(INMATES)))
>>
> 
> Jan
> 

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to