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

Re: [PATCH v1 06/14] xen/riscv: introduce exception context



On Fri, 2023-01-20 at 15:54 +0000, Andrew Cooper wrote:
> On 20/01/2023 2:59 pm, Oleksii Kurochko wrote:
> > diff --git a/xen/arch/riscv/include/asm/processor.h
> > b/xen/arch/riscv/include/asm/processor.h
> > new file mode 100644
> > index 0000000000..5898a09ce6
> > --- /dev/null
> > +++ b/xen/arch/riscv/include/asm/processor.h
> > @@ -0,0 +1,114 @@
> > +/* SPDX-License-Identifier: MIT */
> > +/*****************************************************************
> > *************
> > + *
> > + * Copyright 2019 (C) Alistair Francis <alistair.francis@xxxxxxx>
> > + * Copyright 2021 (C) Bobby Eshleman <bobby.eshleman@xxxxxxxxx>
> > + * Copyright 2023 (C) Vates
> > + *
> > + */
> > +
> > +#ifndef _ASM_RISCV_PROCESSOR_H
> > +#define _ASM_RISCV_PROCESSOR_H
> > +
> > +#include <asm/types.h>
> > +
> > +#define RISCV_CPU_USER_REGS_zero        0
> > +#define RISCV_CPU_USER_REGS_ra          1
> > +#define RISCV_CPU_USER_REGS_sp          2
> > +#define RISCV_CPU_USER_REGS_gp          3
> > +#define RISCV_CPU_USER_REGS_tp          4
> > +#define RISCV_CPU_USER_REGS_t0          5
> > +#define RISCV_CPU_USER_REGS_t1          6
> > +#define RISCV_CPU_USER_REGS_t2          7
> > +#define RISCV_CPU_USER_REGS_s0          8
> > +#define RISCV_CPU_USER_REGS_s1          9
> > +#define RISCV_CPU_USER_REGS_a0          10
> > +#define RISCV_CPU_USER_REGS_a1          11
> > +#define RISCV_CPU_USER_REGS_a2          12
> > +#define RISCV_CPU_USER_REGS_a3          13
> > +#define RISCV_CPU_USER_REGS_a4          14
> > +#define RISCV_CPU_USER_REGS_a5          15
> > +#define RISCV_CPU_USER_REGS_a6          16
> > +#define RISCV_CPU_USER_REGS_a7          17
> > +#define RISCV_CPU_USER_REGS_s2          18
> > +#define RISCV_CPU_USER_REGS_s3          19
> > +#define RISCV_CPU_USER_REGS_s4          20
> > +#define RISCV_CPU_USER_REGS_s5          21
> > +#define RISCV_CPU_USER_REGS_s6          22
> > +#define RISCV_CPU_USER_REGS_s7          23
> > +#define RISCV_CPU_USER_REGS_s8          24
> > +#define RISCV_CPU_USER_REGS_s9          25
> > +#define RISCV_CPU_USER_REGS_s10         26
> > +#define RISCV_CPU_USER_REGS_s11         27
> > +#define RISCV_CPU_USER_REGS_t3          28
> > +#define RISCV_CPU_USER_REGS_t4          29
> > +#define RISCV_CPU_USER_REGS_t5          30
> > +#define RISCV_CPU_USER_REGS_t6          31
> > +#define RISCV_CPU_USER_REGS_sepc        32
> > +#define RISCV_CPU_USER_REGS_sstatus     33
> > +#define RISCV_CPU_USER_REGS_pregs       34
> > +#define RISCV_CPU_USER_REGS_last        35
> 
> This block wants moving into the asm-offsets infrastructure, but I
> suspect they won't want to survive in this form.
> 
> edit: yeah, definitely not this form.  RISCV_CPU_USER_REGS_OFFSET is
> a
> recipe for bugs.
> 
Thanks for the recommendation I'll take it into account during a work
on new version of the patch series.

> > +
> > +#define RISCV_CPU_USER_REGS_OFFSET(x)   ((RISCV_CPU_USER_REGS_##x)
> > * __SIZEOF_POINTER__)
> > +#define RISCV_CPU_USER_REGS_SIZE       
> > RISCV_CPU_USER_REGS_OFFSET(last)
> > +
> > +#ifndef __ASSEMBLY__
> > +
> > +/* On stack VCPU state */
> > +struct cpu_user_regs
> > +{
> > +    register_t zero;
> 
> unsigned long.
Why is it better to define them as \unsigned long' instead of
register_t?
> 
> > +    register_t ra;
> > +    register_t sp;
> > +    register_t gp;
> > +    register_t tp;
> > +    register_t t0;
> > +    register_t t1;
> > +    register_t t2;
> > +    register_t s0;
> > +    register_t s1;
> > +    register_t a0;
> > +    register_t a1;
> > +    register_t a2;
> > +    register_t a3;
> > +    register_t a4;
> > +    register_t a5;
> > +    register_t a6;
> > +    register_t a7;
> > +    register_t s2;
> > +    register_t s3;
> > +    register_t s4;
> > +    register_t s5;
> > +    register_t s6;
> > +    register_t s7;
> > +    register_t s8;
> > +    register_t s9;
> > +    register_t s10;
> > +    register_t s11;
> > +    register_t t3;
> > +    register_t t4;
> > +    register_t t5;
> > +    register_t t6;
> > +    register_t sepc;
> > +    register_t sstatus;
> > +    /* pointer to previous stack_cpu_regs */
> > +    register_t pregs;
> 
> Stale comment?  Also, surely this wants to be cpu_user_regs *pregs; ?
> 
Not really.
Later it would be introduced another one structure:
        struct pcpu_info {
        ...
                struct cpu_user_regs *stack_cpu_regs;
        ...
        };
And stack_cpu_regs will be updated during context saving before jump to
__handle_exception:

        /* new_stack_cpu_regs.pregs = old_stack_cpu_res */
        REG_L   t0, RISCV_PCPUINFO_OFFSET(stack_cpu_regs)(tp)
        REG_S   t0, RISCV_CPU_USER_REGS_OFFSET(pregs)(sp)
        /* Update stack_cpu_regs */
        REG_S   sp, RISCV_PCPUINFO_OFFSET(stack_cpu_regs)(tp)
And I skipped this part as pcpu_info isn't used anywhere now but
reserve some place for pregs in advance.

> > +};
> > +
> > +static inline void wait_for_interrupt(void)
> 
> There's no point writing out the name in longhand for a wrapper
> around a
> single instruction.
> 
Will change it to "... wfi(void)"
> ~Andrew




 


Rackspace

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