xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* undefined instruction error during HYP mode switch for arndale-octa board
@ 2014-04-18 21:26 HyonYoung Choi
  2014-04-21 12:39 ` Julien Grall
  0 siblings, 1 reply; 6+ messages in thread
From: HyonYoung Choi @ 2014-04-18 21:26 UTC (permalink / raw)
  To: Andre Przywara, xen-devel@lists.xen.org; +Cc: Meng Xu


[-- Attachment #1.1: Type: text/plain, Size: 1237 bytes --]

Hello Andre,

I am trying to port xen to arndale-octa board.

I am using u-boot modified for arndale-octa
from tracking-arndale_octa branch of
http://landing-teams/working/samsung/u-boot.git

Because there is no HYP mode switch code in the u-boot,
I tried to port your code in
http://git.linaro.org/git/people/andre.przywara/u-boot.git.
I also put debug code.

In booting, it reboot infinitely with following error message:
======================
   switch_hyp: GIC dist enabled
  switch_hyp: 224 interrupts supportd
  switch_hyp: all interrupts switched to non-secure
  switch_hyp: setting SP start start address (0x9f86d6b4)
  switch_hyp: kicked all CPUs
  VBAR before: 0x9f86c000
undefined instruction
pc : [<9f86d748>]          lr : [<9f86d600>]
sp : 9f7638c0  ip : 0000000f     fp : 9f86e4b4
r10: 9f8ad294  r9 : 00000000     r8 : 9f763f10
r7 : 00000000  r6 : ffffffff     r5 : 00000007  r4 : 9f86c000
r3 : 10482000  r2 : 10480000     r1 : 016e3600  r0 : 00010000
Flags: nZCv  IRQs off  FIQs off  Mode SVC_32
Resetting CPU ...
========================

The problematic code is "mcr     p15, 0, r1, c1, c1, 2"
in arch/arm/cpu/armv7/nonsec_virt.S , nonsec_init function

Do you have any idea about this error?

Regards,
Hyonyoung Choi

[-- Attachment #1.2: Type: text/html, Size: 1910 bytes --]

[-- Attachment #2: Type: text/plain, Size: 126 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: undefined instruction error during HYP mode switch for arndale-octa board
  2014-04-18 21:26 undefined instruction error during HYP mode switch for arndale-octa board HyonYoung Choi
@ 2014-04-21 12:39 ` Julien Grall
  2014-04-21 23:11   ` HyonYoung Choi
  0 siblings, 1 reply; 6+ messages in thread
From: Julien Grall @ 2014-04-21 12:39 UTC (permalink / raw)
  To: HyonYoung Choi, Andre Przywara, xen-devel@lists.xen.org; +Cc: Meng Xu

Hello HyonYoung,

On 18/04/14 22:26, HyonYoung Choi wrote:
> I am trying to port xen to arndale-octa board.
>
> I am using u-boot modified for arndale-octa
> from tracking-arndale_octa branch of
> http://landing-teams/working/samsung/u-boot.git
>
> Because there is no HYP mode switch code in the u-boot,
> I tried to port your code in
> http://git.linaro.org/git/people/andre.przywara/u-boot.git.
> I also put debug code.
>
> In booting, it reboot infinitely with following error message:
> ======================
>     switch_hyp: GIC dist enabled
>    switch_hyp: 224 interrupts supportd
>    switch_hyp: all interrupts switched to non-secure
>    switch_hyp: setting SP start start address (0x9f86d6b4)
>    switch_hyp: kicked all CPUs
>    VBAR before: 0x9f86c000
> undefined instruction
> pc : [<9f86d748>]          lr : [<9f86d600>]
> sp : 9f7638c0  ip : 0000000f     fp : 9f86e4b4
> r10: 9f8ad294  r9 : 00000000     r8 : 9f763f10
> r7 : 00000000  r6 : ffffffff     r5 : 00000007  r4 : 9f86c000
> r3 : 10482000  r2 : 10480000     r1 : 016e3600  r0 : 00010000
> Flags: nZCv  IRQs off  FIQs off  Mode SVC_32
> Resetting CPU ...
> ========================
>
> The problematic code is "mcr     p15, 0, r1, c1, c1, 2"
> in arch/arm/cpu/armv7/nonsec_virt.S , nonsec_init function
> Do you have any idea about this error?

U-boot is trying to write into NSCAR. This register is only writeable in 
Secure PL1 mode.

I suspect U-boot is running in non-secure mode. You may have the same 
problem as the odroid-xu where the SPL BL2 code brings up CPU in NS mode 
(see http://www.gossamer-threads.com/lists/xen/devel/325364#325364).

Regards,

-- 
Julien Grall

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: undefined instruction error during HYP mode switch for arndale-octa board
  2014-04-21 12:39 ` Julien Grall
@ 2014-04-21 23:11   ` HyonYoung Choi
  2014-04-22 14:09     ` Julien Grall
  0 siblings, 1 reply; 6+ messages in thread
From: HyonYoung Choi @ 2014-04-21 23:11 UTC (permalink / raw)
  To: Julien Grall, xen-devel@lists.xen.org; +Cc: Meng Xu


[-- Attachment #1.1: Type: text/plain, Size: 4797 bytes --]

Hello Julien,

At first, I want to know who is the maintainer for this U-Boot or
Hypervisor mode support section.

>From previous email, I found that U-boot is running already in non-secure
mode.

>From the comment of the erroneous code in arch/arm/cpu/armv7/nonsec_vert.S,
it is guessed that it tries to switch non-secure mode assuming the CPU is
in secure mode.
========================================
/*
 * Switch a core to non-secure state.
 *
 *  1. initialize the GIC per-core interface
 *  2. allow coprocessor access in non-secure modes
 *  3. switch the cpu mode (by calling "smc #0")
 *
 * Called from smp_pen by secondary cores and directly by the BSP.
 * Do not assume that the stack is available and only use registers
 * r0-r3 and r12.
 *
 * PERIPHBASE is used to get the GIC address. This could be 40 bits long,
 * though, but we check this in C before calling this function.
 */
ENTRY(_nonsec_init)
=========================================

But I have known CPU is already in non-secure mode,
so, we commented out the calling _nonsec_init() and
just call hypervisor mode switch function only as below:

=========================================
static void do_nonsec_virt_switch(void)
{
#if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_ARMV7_VIRT)
//      if (armv7_switch_nonsec() == 0)
#ifdef CONFIG_ARMV7_VIRT
                if (armv7_switch_hyp() == 0)
                        debug("entered HYP mode\n");
#else
                debug("entered non-secure state\n");
#endif
#endif
}
=========================================

The code of function armv7_switch_hyp() is simple:
=========================================
ENTRY(_switch_to_hyp)
        mov     r0, lr
        mov     r1, sp                          @ save SVC copy of LR and SP
        isb
        hvc #0                   @ for older asm: .byte 0x70, 0x00, 0x40,
0xe1
        mov     sp, r1
        mov     lr, r0                          @ restore SVC copy of LR
and SP
        bx      lr
ENDPROC(_switch_to_hyp)
===========================================

But it hangs while booting in "hvc #0" instruction.

----------------------------------------------------------------------
## Booting kernel from Legacy Image at 20007000 ...
   Image Name:
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    656144 Bytes = 640.8 KiB
   Load Address: 20008000
   Entry Point:  20008000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 21f00000
   Booting using the fdt blob at 0x21f00000
   Loading Kernel Image ... OK
OK
   reserving fdt memory region: addr=21f00000 size=8000
   Using Device Tree in place at 21f00000, end 21f0afff
  switch_hyp: CPU supports virt ext
----------------------------------------------------------------------

>From the original sequence of function calls,
nonsec_init() is for turning to non-secure mode,
then it calls switch_to_hyp () in non-secure mode.

Is there any preparation for executing "hvc" instruction or any privilege
to be executed?

Best,
Hyonyoung

2014-04-21 8:39 GMT-04:00 Julien Grall <julien.grall@linaro.org>:

> Hello HyonYoung,
>
>
> On 18/04/14 22:26, HyonYoung Choi wrote:
>
>> I am trying to port xen to arndale-octa board.
>>
>> I am using u-boot modified for arndale-octa
>> from tracking-arndale_octa branch of
>> http://landing-teams/working/samsung/u-boot.git
>>
>> Because there is no HYP mode switch code in the u-boot,
>> I tried to port your code in
>> http://git.linaro.org/git/people/andre.przywara/u-boot.git.
>> I also put debug code.
>>
>> In booting, it reboot infinitely with following error message:
>> ======================
>>     switch_hyp: GIC dist enabled
>>    switch_hyp: 224 interrupts supportd
>>    switch_hyp: all interrupts switched to non-secure
>>    switch_hyp: setting SP start start address (0x9f86d6b4)
>>    switch_hyp: kicked all CPUs
>>    VBAR before: 0x9f86c000
>> undefined instruction
>> pc : [<9f86d748>]          lr : [<9f86d600>]
>> sp : 9f7638c0  ip : 0000000f     fp : 9f86e4b4
>> r10: 9f8ad294  r9 : 00000000     r8 : 9f763f10
>> r7 : 00000000  r6 : ffffffff     r5 : 00000007  r4 : 9f86c000
>> r3 : 10482000  r2 : 10480000     r1 : 016e3600  r0 : 00010000
>> Flags: nZCv  IRQs off  FIQs off  Mode SVC_32
>> Resetting CPU ...
>> ========================
>>
>> The problematic code is "mcr     p15, 0, r1, c1, c1, 2"
>> in arch/arm/cpu/armv7/nonsec_virt.S , nonsec_init function
>> Do you have any idea about this error?
>>
>
> U-boot is trying to write into NSCAR. This register is only writeable in
> Secure PL1 mode.
>
> I suspect U-boot is running in non-secure mode. You may have the same
> problem as the odroid-xu where the SPL BL2 code brings up CPU in NS mode
> (see http://www.gossamer-threads.com/lists/xen/devel/325364#325364).
>
> Regards,
>
> --
> Julien Grall
>

[-- Attachment #1.2: Type: text/html, Size: 13521 bytes --]

[-- Attachment #2: Type: text/plain, Size: 126 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: undefined instruction error during HYP mode switch for arndale-octa board
  2014-04-21 23:11   ` HyonYoung Choi
@ 2014-04-22 14:09     ` Julien Grall
  2014-04-29  3:18       ` Tushar Behera
  2014-04-29  3:18       ` Tushar Behera
  0 siblings, 2 replies; 6+ messages in thread
From: Julien Grall @ 2014-04-22 14:09 UTC (permalink / raw)
  To: HyonYoung Choi
  Cc: Tushar Behera, Meng Xu, Ian Campbell, Stefano Stabellini,
	xen-devel@lists.xen.org

On 04/22/2014 12:11 AM, HyonYoung Choi wrote:
> Hello Julien,

Hello HyonYoung,

> At first, I want to know who is the maintainer for this U-Boot or
> Hypervisor mode support section.

I'm not sure who is the maintainer of this U-boot. I've cced Tushar
which seems to be in most of the commit related to the octa.

> From previous email, I found that U-boot is running already in
> non-secure mode.
> 
> From the comment of the erroneous code in arch/arm/cpu/armv7/nonsec_vert.S, 
> it is guessed that it tries to switch non-secure mode assuming the CPU
> is in secure mode.
> ========================================
> /*
>  * Switch a core to non-secure state.
>  *
>  *  1. initialize the GIC per-core interface
>  *  2. allow coprocessor access in non-secure modes
>  *  3. switch the cpu mode (by calling "smc #0")
>  *
>  * Called from smp_pen by secondary cores and directly by the BSP.
>  * Do not assume that the stack is available and only use registers
>  * r0-r3 and r12.
>  *
>  * PERIPHBASE is used to get the GIC address. This could be 40 bits long,
>  * though, but we check this in C before calling this function.
>  */
> ENTRY(_nonsec_init)
> =========================================
> 
> But I have known CPU is already in non-secure mode, 
> so, we commented out the calling _nonsec_init() and
> just call hypervisor mode switch function only as below:
> 
> =========================================
> static void do_nonsec_virt_switch(void)
> {
> #if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_ARMV7_VIRT)
> //      if (armv7_switch_nonsec() == 0)
> #ifdef CONFIG_ARMV7_VIRT
>                 if (armv7_switch_hyp() == 0)
>                         debug("entered HYP mode\n");
> #else
>                 debug("entered non-secure state\n");
> #endif
> #endif
> }
> =========================================
> 
> The code of function armv7_switch_hyp() is simple:
> =========================================
> ENTRY(_switch_to_hyp)
>         mov     r0, lr
>         mov     r1, sp                          @ save SVC copy of LR and SP
>         isb
>         hvc #0                   @ for older asm: .byte 0x70, 0x00,
> 0x40, 0xe1
>         mov     sp, r1
>         mov     lr, r0                          @ restore SVC copy of LR
> and SP
>         bx      lr
> ENDPROC(_switch_to_hyp)
> ===========================================
> 
> But it hangs while booting in "hvc #0" instruction.
> 
> ----------------------------------------------------------------------
> ## Booting kernel from Legacy Image at 20007000 ...
>    Image Name:   
>    Image Type:   ARM Linux Kernel Image (uncompressed)
>    Data Size:    656144 Bytes = 640.8 KiB
>    Load Address: 20008000
>    Entry Point:  20008000
>    Verifying Checksum ... OK
> ## Flattened Device Tree blob at 21f00000
>    Booting using the fdt blob at 0x21f00000
>    Loading Kernel Image ... OK
> OK
>    reserving fdt memory region: addr=21f00000 size=8000
>    Using Device Tree in place at 21f00000, end 21f0afff
>   switch_hyp: CPU supports virt ext
> ----------------------------------------------------------------------
> 
> From the original sequence of function calls,
> nonsec_init() is for turning to non-secure mode,
> then it calls switch_to_hyp () in non-secure mode.
> 
> Is there any preparation for executing "hvc" instruction or any
> privilege to be executed?

You've commented the function armv7_switch_nonsec that set up the
monitors traps (and therefore the hyp trap). The "hvc #0" instruction
will jump to an unknown memory.

Regards,

-- 
Julien Grall

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: undefined instruction error during HYP mode switch for arndale-octa board
  2014-04-22 14:09     ` Julien Grall
@ 2014-04-29  3:18       ` Tushar Behera
  2014-04-29  3:18       ` Tushar Behera
  1 sibling, 0 replies; 6+ messages in thread
From: Tushar Behera @ 2014-04-29  3:18 UTC (permalink / raw)
  To: Julien Grall, HyonYoung Choi
  Cc: Stefano Stabellini, Meng Xu, Ian Campbell,
	xen-devel@lists.xen.org

On 04/22/2014 07:39 PM, Julien Grall wrote:
> On 04/22/2014 12:11 AM, HyonYoung Choi wrote:
>> Hello Julien,
> 
> Hello HyonYoung,
> 
>> At first, I want to know who is the maintainer for this U-Boot or
>> Hypervisor mode support section.
> 
> I'm not sure who is the maintainer of this U-boot. I've cced Tushar
> which seems to be in most of the commit related to the octa.
> 

The u-boot code was referenced from following git tree[1]. I have little
knowledge regarding Hypervisor mode support, so won't be of much help :(

[1] http://git.insignal.co.kr/insignal/arndale_octa-jb_mr1.1/u-boot

>> From previous email, I found that U-boot is running already in
>> non-secure mode.
>>
>> From the comment of the erroneous code in arch/arm/cpu/armv7/nonsec_vert.S, 
>> it is guessed that it tries to switch non-secure mode assuming the CPU
>> is in secure mode.
>> ========================================
>> /*
>>  * Switch a core to non-secure state.
>>  *
>>  *  1. initialize the GIC per-core interface
>>  *  2. allow coprocessor access in non-secure modes
>>  *  3. switch the cpu mode (by calling "smc #0")
>>  *
>>  * Called from smp_pen by secondary cores and directly by the BSP.
>>  * Do not assume that the stack is available and only use registers
>>  * r0-r3 and r12.
>>  *
>>  * PERIPHBASE is used to get the GIC address. This could be 40 bits long,
>>  * though, but we check this in C before calling this function.
>>  */
>> ENTRY(_nonsec_init)
>> =========================================
>>
>> But I have known CPU is already in non-secure mode, 
>> so, we commented out the calling _nonsec_init() and
>> just call hypervisor mode switch function only as below:
>>
>> =========================================
>> static void do_nonsec_virt_switch(void)
>> {
>> #if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_ARMV7_VIRT)
>> //      if (armv7_switch_nonsec() == 0)
>> #ifdef CONFIG_ARMV7_VIRT
>>                 if (armv7_switch_hyp() == 0)
>>                         debug("entered HYP mode\n");
>> #else
>>                 debug("entered non-secure state\n");
>> #endif
>> #endif
>> }
>> =========================================
>>
>> The code of function armv7_switch_hyp() is simple:
>> =========================================
>> ENTRY(_switch_to_hyp)
>>         mov     r0, lr
>>         mov     r1, sp                          @ save SVC copy of LR and SP
>>         isb
>>         hvc #0                   @ for older asm: .byte 0x70, 0x00,
>> 0x40, 0xe1
>>         mov     sp, r1
>>         mov     lr, r0                          @ restore SVC copy of LR
>> and SP
>>         bx      lr
>> ENDPROC(_switch_to_hyp)
>> ===========================================
>>
>> But it hangs while booting in "hvc #0" instruction.
>>
>> ----------------------------------------------------------------------
>> ## Booting kernel from Legacy Image at 20007000 ...
>>    Image Name:   
>>    Image Type:   ARM Linux Kernel Image (uncompressed)
>>    Data Size:    656144 Bytes = 640.8 KiB
>>    Load Address: 20008000
>>    Entry Point:  20008000
>>    Verifying Checksum ... OK
>> ## Flattened Device Tree blob at 21f00000
>>    Booting using the fdt blob at 0x21f00000
>>    Loading Kernel Image ... OK
>> OK
>>    reserving fdt memory region: addr=21f00000 size=8000
>>    Using Device Tree in place at 21f00000, end 21f0afff
>>   switch_hyp: CPU supports virt ext
>> ----------------------------------------------------------------------
>>
>> From the original sequence of function calls,
>> nonsec_init() is for turning to non-secure mode,
>> then it calls switch_to_hyp () in non-secure mode.
>>
>> Is there any preparation for executing "hvc" instruction or any
>> privilege to be executed?
> 
> You've commented the function armv7_switch_nonsec that set up the
> monitors traps (and therefore the hyp trap). The "hvc #0" instruction
> will jump to an unknown memory.
> 
> Regards,
> 


-- 
Tushar Behera

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: undefined instruction error during HYP mode switch for arndale-octa board
  2014-04-22 14:09     ` Julien Grall
  2014-04-29  3:18       ` Tushar Behera
@ 2014-04-29  3:18       ` Tushar Behera
  1 sibling, 0 replies; 6+ messages in thread
From: Tushar Behera @ 2014-04-29  3:18 UTC (permalink / raw)
  To: Julien Grall, HyonYoung Choi
  Cc: Stefano Stabellini, Meng Xu, Ian Campbell,
	xen-devel@lists.xen.org

On 04/22/2014 07:39 PM, Julien Grall wrote:
> On 04/22/2014 12:11 AM, HyonYoung Choi wrote:
>> Hello Julien,
> 
> Hello HyonYoung,
> 
>> At first, I want to know who is the maintainer for this U-Boot or
>> Hypervisor mode support section.
> 
> I'm not sure who is the maintainer of this U-boot. I've cced Tushar
> which seems to be in most of the commit related to the octa.
> 

The u-boot code was referenced from following git tree[1]. I have little
knowledge regarding Hypervisor mode support, so won't be of much help :(

[1] http://git.insignal.co.kr/insignal/arndale_octa-jb_mr1.1/u-boot

>> From previous email, I found that U-boot is running already in
>> non-secure mode.
>>
>> From the comment of the erroneous code in arch/arm/cpu/armv7/nonsec_vert.S, 
>> it is guessed that it tries to switch non-secure mode assuming the CPU
>> is in secure mode.
>> ========================================
>> /*
>>  * Switch a core to non-secure state.
>>  *
>>  *  1. initialize the GIC per-core interface
>>  *  2. allow coprocessor access in non-secure modes
>>  *  3. switch the cpu mode (by calling "smc #0")
>>  *
>>  * Called from smp_pen by secondary cores and directly by the BSP.
>>  * Do not assume that the stack is available and only use registers
>>  * r0-r3 and r12.
>>  *
>>  * PERIPHBASE is used to get the GIC address. This could be 40 bits long,
>>  * though, but we check this in C before calling this function.
>>  */
>> ENTRY(_nonsec_init)
>> =========================================
>>
>> But I have known CPU is already in non-secure mode, 
>> so, we commented out the calling _nonsec_init() and
>> just call hypervisor mode switch function only as below:
>>
>> =========================================
>> static void do_nonsec_virt_switch(void)
>> {
>> #if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_ARMV7_VIRT)
>> //      if (armv7_switch_nonsec() == 0)
>> #ifdef CONFIG_ARMV7_VIRT
>>                 if (armv7_switch_hyp() == 0)
>>                         debug("entered HYP mode\n");
>> #else
>>                 debug("entered non-secure state\n");
>> #endif
>> #endif
>> }
>> =========================================
>>
>> The code of function armv7_switch_hyp() is simple:
>> =========================================
>> ENTRY(_switch_to_hyp)
>>         mov     r0, lr
>>         mov     r1, sp                          @ save SVC copy of LR and SP
>>         isb
>>         hvc #0                   @ for older asm: .byte 0x70, 0x00,
>> 0x40, 0xe1
>>         mov     sp, r1
>>         mov     lr, r0                          @ restore SVC copy of LR
>> and SP
>>         bx      lr
>> ENDPROC(_switch_to_hyp)
>> ===========================================
>>
>> But it hangs while booting in "hvc #0" instruction.
>>
>> ----------------------------------------------------------------------
>> ## Booting kernel from Legacy Image at 20007000 ...
>>    Image Name:   
>>    Image Type:   ARM Linux Kernel Image (uncompressed)
>>    Data Size:    656144 Bytes = 640.8 KiB
>>    Load Address: 20008000
>>    Entry Point:  20008000
>>    Verifying Checksum ... OK
>> ## Flattened Device Tree blob at 21f00000
>>    Booting using the fdt blob at 0x21f00000
>>    Loading Kernel Image ... OK
>> OK
>>    reserving fdt memory region: addr=21f00000 size=8000
>>    Using Device Tree in place at 21f00000, end 21f0afff
>>   switch_hyp: CPU supports virt ext
>> ----------------------------------------------------------------------
>>
>> From the original sequence of function calls,
>> nonsec_init() is for turning to non-secure mode,
>> then it calls switch_to_hyp () in non-secure mode.
>>
>> Is there any preparation for executing "hvc" instruction or any
>> privilege to be executed?
> 
> You've commented the function armv7_switch_nonsec that set up the
> monitors traps (and therefore the hyp trap). The "hvc #0" instruction
> will jump to an unknown memory.
> 
> Regards,
> 


-- 
Tushar Behera

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-04-29  3:18 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-04-18 21:26 undefined instruction error during HYP mode switch for arndale-octa board HyonYoung Choi
2014-04-21 12:39 ` Julien Grall
2014-04-21 23:11   ` HyonYoung Choi
2014-04-22 14:09     ` Julien Grall
2014-04-29  3:18       ` Tushar Behera
2014-04-29  3:18       ` Tushar Behera

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).