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

Re: [PATCH v5 4/4] xen/x86: switch x86 to use generic implemetation of bug.h



On Tue, 2023-03-07 at 13:59 +0100, Jan Beulich wrote:
> On 07.03.2023 13:52, Oleksii wrote:
> > On Mon, 2023-03-06 at 11:36 +0100, Jan Beulich wrote:
> > > On 03.03.2023 11:38, Oleksii Kurochko wrote:
> > > > --- a/xen/arch/x86/include/asm/bug.h
> > > > +++ b/xen/arch/x86/include/asm/bug.h
> > > > @@ -1,79 +1,12 @@
> > > >  #ifndef __X86_BUG_H__
> > > >  #define __X86_BUG_H__
> > > >  
> > > > -#define BUG_DISP_WIDTH    24
> > > > -#define BUG_LINE_LO_WIDTH (31 - BUG_DISP_WIDTH)
> > > > -#define BUG_LINE_HI_WIDTH (31 - BUG_DISP_WIDTH)
> > > > +#define BUG_DEBUGGER_TRAP_FATAL(regs)
> > > > debugger_trap_fatal(X86_EXC_GP,regs)
> > > 
> > > Along the lines of a comment on an earlier patch, please move
> > > this
> > > ...
> > > 
> > > >  #ifndef __ASSEMBLY__
> > > 
> > > ... into the thus guarded section.
> > But it was defined there before the patch series and these definies
> > are
> > used in "#else /* !__ASSEMBLY__ */"
> 
> Since you use plural, maybe a misunderstanding? My comment was solely
> on the line you add; the removed lines are there merely as context.
Really. I misunderstood you.
> 
> > > > @@ -1166,12 +1167,9 @@ void cpuid_hypervisor_leaves(const
> > > > struct
> > > > vcpu *v, uint32_t leaf,
> > > >  
> > > >  void do_invalid_op(struct cpu_user_regs *regs)
> > > >  {
> > > > -    const struct bug_frame *bug = NULL;
> > > >      u8 bug_insn[2];
> > > > -    const char *prefix = "", *filename, *predicate, *eip =
> > > > (char
> > > > *)regs->rip;
> > > > -    unsigned long fixup;
> > > > -    int id = -1, lineno;
> > > > -    const struct virtual_region *region;
> > > > +    const char *eip = (char *)regs->rip;
> > > 
> > > I realize "char" was used before, but now that this is all on its
> > > own,
> > > can this at least become "unsigned char", but yet better "void"?
> > If we change it to "void" shouldn't it require additional casts
> > here (
> > which is not nice ):
> >        eip += sizeof(bug_insn);
> 
> Arithmetic on pointers to void is a GNU extension which we make
> heavy use of all over the hypervisor.
Got it. Than I'll rework it with 'void *'.
> 
> > > >      switch ( id )
> > > >      {
> > > > +    case BUGFRAME_run_fn:
> > > >      case BUGFRAME_warn:
> > > > -        printk("Xen WARN at %s%s:%d\n", prefix, filename,
> > > > lineno);
> > > > -        show_execution_state(regs);
> > > >          fixup_exception_return(regs, (unsigned long)eip);
> > > >          return;
> > > > -
> > > > -    case BUGFRAME_bug:
> > > > -        printk("Xen BUG at %s%s:%d\n", prefix, filename,
> > > > lineno);
> > > > -
> > > > -        if ( debugger_trap_fatal(TRAP_invalid_op, regs) )
> > > > -            return;
> > > 
> > > This and ...
> > > 
> > > > -        show_execution_state(regs);
> > > > -        panic("Xen BUG at %s%s:%d\n", prefix, filename,
> > > > lineno);
> > > > -
> > > > -    case BUGFRAME_assert:
> > > > -        /* ASSERT: decode the predicate string pointer. */
> > > > -        predicate = bug_msg(bug);
> > > > -        if ( !is_kernel(predicate) && !is_patch(predicate) )
> > > > -            predicate = "<unknown>";
> > > > -
> > > > -        printk("Assertion '%s' failed at %s%s:%d\n",
> > > > -               predicate, prefix, filename, lineno);
> > > > -
> > > > -        if ( debugger_trap_fatal(TRAP_invalid_op, regs) )
> > > > -            return;
> > > 
> > > ... this return look to have no proper representation in the new
> > > logic; both cases fall through to ...
> > > 
> > > > -        show_execution_state(regs);
> > > > -        panic("Assertion '%s' failed at %s%s:%d\n",
> > > > -              predicate, prefix, filename, lineno);
> > > >      }
> > > >  
> > > >   die:
> > > 
> > > ... here now, which is an unwanted functional change.
> > Oh, you are right. So then in case we have correct id it is needed
> > to
> > do only return:
> >     switch ( id )
> >     {
> >     case BUGFRAME_run_fn:
> >     case BUGFRAME_warn:
> >         fixup_exception_return(regs, (unsigned long)eip);
> >         break;
> >     }
> > 
> >     return;
> 
> Except the "return" needs to remain inside the switch; unrecognized
> id
> values should still fall through to the "die" label.
Yeah, it is still possible to get unrecognized id.
Thanks.
> 

~ Oleksii



 


Rackspace

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