[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [PATCH v3 10/43] arm64: add exception support
On Mon, Apr 30, 2018 at 09:05:23AM +0100, Julien Grall wrote: Hi Julien, > Hi Shijie, > > On 28/04/2018 06:40, Huang Shijie wrote: > >On Wed, Apr 18, 2018 at 06:48:24PM +0100, Julien Grall wrote: > >>Hi Shijie, > >> > >>On 16/04/18 07:31, Huang Shijie wrote: > >>>This patch adds the exception support for arm64: > >>> .0) Add arm64/traps.h, and add new pt_regs{} for arm64. > >>> .1) Add save_registers/restore_registers which are based on FreeBSD > >>> code. > >> > >>Please give a pointer to the code. > >okay. > >> > >>> .2) setup the vector table > >>> .3) remove the code for arm32. > >> > >>This does not make sense in a patch that is adding arm64 support. The code > >>removed look fairly independent, so can you move that in #2. > >okay. > >> > >>> > >>>Signed-off-by: Huang Shijie <shijie.huang@xxxxxxx> > >>>--- > >>> arch/arm/arm64/arm64.S | 147 > >>> ++++++++++++++++++++++++++++++++++++++++++++++ > >>> arch/arm/arm64/traps.c | 16 +++++ > >>> include/arm/arm64/traps.h | 27 +++++++++ > >>> include/arm/traps.h | 21 +------ > >>> 4 files changed, 191 insertions(+), 20 deletions(-) > >>> create mode 100644 arch/arm/arm64/traps.c > >>> create mode 100644 include/arm/arm64/traps.h > >>> > >>>diff --git a/arch/arm/arm64/arm64.S b/arch/arm/arm64/arm64.S > >>>index b454cc6..9eb7ea0 100644 > >>>--- a/arch/arm/arm64/arm64.S > >>>+++ b/arch/arm/arm64/arm64.S > >>>@@ -1,6 +1,7 @@ > >>> #include "asm.h" > >>> #include <arch_limits.h> > >>> #include <arm64/pagetable.h> > >>>+#include <arm64/traps.h> > >>> #include <xen/xen.h> > >>> /* This macro will use the x0/x1/x2/x16 */ > >>>@@ -101,6 +102,11 @@ ENTRY(_start) > >>> msr ttbr0_el1, x0 > >>> isb > >>>+ /* Load the exception vectors */ > >>>+ ldr x2, =vector_table > >>>+ msr vbar_el1, x2 > >>>+ isb > >> > >>I don't think the isb is necessary here. You can rely on the one below (when > >>setting up the SCTLR). > >> > >>This would be fine because the vector table contains virtual address so it > >>is unusable before turning on the MMU. > >> > >okay, I will think about it. > >>>+ > >>> /* Turning on MMU */ > >>> tlbi vmalle1 > >>> dsb nsh > >>>@@ -284,3 +290,144 @@ _setup_idmap_pgtable: > >>> adr x0, idmap_l0_pgtable > >>> dsb sy > >>> ret > >>>+ > >>>+/* The save_registers/restore_registers are based on the code in FreeBSD > >>>*/ > >> > >>Missing full stop. > >> > >>>+.macro save_registers el > >> > >>All the code below is using hard tab, however the rest of the file is using > >>soft tab. Please replace all hard tab with soft tab. > >I will change it to soft tab. > >> > >>>+ mov x18, sp > >> > >>Something is wrong here. You seem to overwrite x18 without saving it. Did I > >>miss anything? > >I copied from the freebsd code. The original code uses x18 here. > > Well, freebsd is using x18 because they effectively saved it a bit before to > help with DTRACE support. So you need to adapt the code for Mini-OS and > rework what does not apply for us. okay, I will do some rework about this code. > > [...] > > >> > >>>+ > >>>+ sub sp, sp, #(PT_REG_SIZE) > >>>+ > >>>+ stp x28, x29, [sp, #(PT_REG_X + 28 * 8)] > >> > >>I might be nice to make PT_REG_X a macro take the registers in parameters. > >>This would ease the reading of the code. > >okay, no problem. > > > >> > >>>+ stp x26, x27, [sp, #(PT_REG_X + 26 * 8)] > >>>+ stp x24, x25, [sp, #(PT_REG_X + 24 * 8)] > >>>+ stp x22, x23, [sp, #(PT_REG_X + 22 * 8)] > >>>+ stp x20, x21, [sp, #(PT_REG_X + 20 * 8)] > >>>+ stp x18, x19, [sp, #(PT_REG_X + 18 * 8)] > >>>+ stp x16, x17, [sp, #(PT_REG_X + 16 * 8)] > >>>+ stp x14, x15, [sp, #(PT_REG_X + 14 * 8)] > >>>+ stp x12, x13, [sp, #(PT_REG_X + 12 * 8)] > >>>+ stp x10, x11, [sp, #(PT_REG_X + 10 * 8)] > >>>+ stp x8, x9, [sp, #(PT_REG_X + 8 * 8)] > >>>+ stp x6, x7, [sp, #(PT_REG_X + 6 * 8)] > >>>+ stp x4, x5, [sp, #(PT_REG_X + 4 * 8)] > >>>+ stp x2, x3, [sp, #(PT_REG_X + 2 * 8)] > >>>+ stp x0, x1, [sp, #(PT_REG_X + 0 * 8)] > >>>+ > >>>+ mrs x10, elr_el1 > >>>+ mrs x11, spsr_el1 > >>>+ mrs x12, esr_el1 > >>>+.if \el == 0 > >> > >>AFAICT you will never go in EL0. So is there any reason to handle EL0? > >there is invalid case for EL0, such as el0_irq. > >So keep it here for them. > > I know the case is invalid but you should never reach them as you never > return in EL0. My concern here is you seem to loosely implement EL0 support > and no way to test whether it is going to work. So what's the purpose of > keeping code that's going to rotten? okay, I can remove the code for EL0. > > > > >> > >>>+ mrs x18, sp_el0 > >>>+.endif > >> > >>Hmm I think you want the "mov x18, sp" but you also need to add the > >>PT_REG_SIZE to get the correct sp. > >The sp is correct here. > >We have sub the PT_REG_SIZE at the beginning of the @save_registers. > > Well, the SP you want to store is the stack pointer before the context was > saved. This is the more meaningful one when you want to print the context > what was running before the exception. > > But as you will need to move the instruction mov x18, sp here you will end > to up to store the wrong SP here. Do you mean I should store the SP like this: -------------------------------------- sub sp, sp, #(PT_REG_SIZE) mov x18, sp stp .... stp .... stp .... -------------------------------------- In this way, we store the correct SP value. > > >> > >>>+ str x10, [sp, #(PT_REG_ELR)] > >>>+ stp w11, w12, [sp, #(PT_REG_SPSR)] > >>>+ stp x18, x30, [sp, #(PT_REG_SP)] > >>>+.endm > >>>+ > >>>+.macro restore_registers el > >> > >>Will you ever reach this macro with interrupt enabled? If so, don't you want > >>to disable them. So you don't get interrupt in the middle of the restore? > >The interrupt is disabled here. > > Then document it please. okay. > > > > > > >> > >>>+ ldp x18, x30, [sp, #(PT_REG_SP)] > >>>+ ldp x10, x11, [sp, #(PT_REG_ELR)] > >>>+.if \el == 0 > >>>+ msr sp_el0, x18 > >>>+.endif > >>>+ msr spsr_el1, x11 > >>>+ msr elr_el1, x10 > >>>+ > >>>+ ldp x0, x1, [sp, #(PT_REG_X + 0 * 8)] > >>>+ ldp x2, x3, [sp, #(PT_REG_X + 2 * 8)] > >>>+ ldp x4, x5, [sp, #(PT_REG_X + 4 * 8)] > >>>+ ldp x6, x7, [sp, #(PT_REG_X + 6 * 8)] > >>>+ ldp x8, x9, [sp, #(PT_REG_X + 8 * 8)] > >>>+ ldp x10, x11, [sp, #(PT_REG_X + 10 * 8)] > >>>+ ldp x12, x13, [sp, #(PT_REG_X + 12 * 8)] > >>>+ ldp x14, x15, [sp, #(PT_REG_X + 14 * 8)] > >>>+ ldp x16, x17, [sp, #(PT_REG_X + 16 * 8)] > >>>+ ldp x18, x19, [sp, #(PT_REG_X + 18 * 8)] > >>>+ ldp x20, x21, [sp, #(PT_REG_X + 20 * 8)] > >>>+ ldp x22, x23, [sp, #(PT_REG_X + 22 * 8)] > >>>+ ldp x24, x25, [sp, #(PT_REG_X + 24 * 8)] > >>>+ ldp x26, x27, [sp, #(PT_REG_X + 26 * 8)] > >>>+ ldp x28, x29, [sp, #(PT_REG_X + 28 * 8)] > >>>+ > >>>+ mov sp, x18 > >> > >>So x18 will not contain the sp here. But I think adding PT_REG_SIZE to sp > >>should be enough here. > >the x18 stores the previous sp maybe is different with current sp, > > So add PT_REG_SIZE to sp is wrong. > > See above. > > >> > >>>+ eret > >>>+.endm > >>>+ > >>>+ .globl IRQ_handler > >>>+IRQ_handler: > >>>+ .long 0x0 > >> > >>I am not sure to understand the purpose of IRQ_handler. Can't you just > >>directly call the handler? > >We have already have the el1_irq to handle the IRQ. > >and we need to save the context before call IRQ_handler. > > You didn't understand why question. I didn't ask whether you can replace > el1_irq by IRQ_handler, but why you need a pointer to the handler here > rather than calling gic_handler in el1_irq directly. Yes, I think we can call gic_handler directly in el1_irq. I admit that I did not do the code optimization for it. > > [...] > > >>>+#define PT_REG_SIZE (272) > >>>+ > >>>+#define PT_REG_SP (0) > >>>+#define PT_REG_ELR (16) > >>>+#define PT_REG_SPSR (24) > >>>+#define PT_REG_X (32) > >> > >>I honestly don't like hardcoding offset of the structure. This is a real > >>call to mess up in the future (or even now). The lack of comments don't help > >>either. > >> > >>But I am pretty sure I asked it before. Can't they be generated > >>automatically? > >I do not know how to generated it automatically :( > > I have already suggested way in the previous e-mails. I am sure you can go > through them again and look at what was discussed. sorry, I searched my old email, but I cannot find it. could you please tell me again? Thanks Huang Shijie _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |