|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 12/14] xen/riscv: introduce an implementation of macros from <asm/bug.h>
On 08.02.2023 13:00, Oleksii wrote:
> On Tue, 2023-02-07 at 16:07 +0100, Jan Beulich wrote:
>> On 07.02.2023 15:46, Oleksii Kurochko wrote:
>>> --- /dev/null
>>> +++ b/xen/arch/riscv/include/asm/bug.h
>>> @@ -0,0 +1,38 @@
>>> +/* SPDX-License-Identifier: GPL-2.0 */
>>> +/*
>>> + * Copyright (C) 2012 Regents of the University of California
>>> + * Copyright (C) 2021-2023 Vates
>>> + *
>>> + */
>>> +#ifndef _ASM_RISCV_BUG_H
>>> +#define _ASM_RISCV_BUG_H
>>> +
>>> +#include <xen/types.h>
>>> +
>>> +#ifndef __ASSEMBLY__
>>> +
>>> +#define BUG_FN_REG t0
>>> +
>>> +#define BUG_INSTR "ebreak"
>>> +
>>> +#define INSN_LENGTH_MASK _UL(0x3)
>>> +#define INSN_LENGTH_32 _UL(0x3)
>>
>> I assume these are deliberately over-simplified (not accounting for
>> wider than 32-bit insns in any way)?
> The base instruction set has a fixed length of 32-bit naturally aligned
> instructions.
>
> There are extensions of variable length ( where each instruction can be
> any number of 16-bit parcels in length ) but they aren't used in Xen
> and Linux kernel ( where these definitions were taken from ).
Can there then please be a comment here about this (current) assumption?
>>> +#define BUG_INSN_32 _UL(0x00100073) /* ebreak */
>>> +#define BUG_INSN_16 _UL(0x9002) /* c.ebreak */
>>> +#define COMPRESSED_INSN_MASK _UL(0xffff)
>>> +
>>> +#define GET_INSN_LENGTH(insn) \
>>> +({ \
>>> + unsigned long len; \
>>> + len = ((insn & INSN_LENGTH_MASK) == INSN_LENGTH_32) ? \
>>> + 4UL : 2UL; \
>>> + len; \
>>
>> Any reason for the use of "unsigned long" (not "unsigned int") here?
>>
> There is no specific reason (at least I don't see it now). It looks
> like it can be used here even smaller type than 'unsigned int' as len,
> in current case, can be either 4 or 2.
Often working with more narrow types isn't as efficient, so using
(signed/unsigned) int is generally best unless there are specific
reasons to use a wider or more narrow type.
>>> @@ -97,7 +98,136 @@ static void do_unexpected_trap(const struct
>>> cpu_user_regs *regs)
>>> die();
>>> }
>>>
>>> +void show_execution_state(const struct cpu_user_regs *regs)
>>> +{
>>> + early_printk("implement show_execution_state(regs)\n");
>>> +}
>>> +
>>> +int do_bug_frame(const struct cpu_user_regs *regs, vaddr_t pc)
>>> +{
>>> + struct bug_frame *start, *end;
>>> + struct bug_frame *bug = NULL;
>>
>> const?
> regs aren't changed in the function so I decided to put it as const.
Hmm, a misunderstanding? I was asking whether there is a reason not
to have the three local variables be "pointer to const". As a rule
of thumb, const should be added to pointed-to types whenever possible.
That way it's very obvious even when looking only in passing that the
value/array pointed to isn't supposed to be modified through the
variable (or function parameter).
>>> + unsigned int id = 0;
>>> + const char *filename, *predicate;
>>> + int lineno;
>>> +
>>> + unsigned long bug_frames[] = {
>>> + (unsigned long)&__start_bug_frames[0],
>>> + (unsigned long)&__stop_bug_frames_0[0],
>>> + (unsigned long)&__stop_bug_frames_1[0],
>>> + (unsigned long)&__stop_bug_frames_2[0],
>>> + (unsigned long)&__stop_bug_frames_3[0],
>>> + };
>>> +
>>> + for ( id = 0; id < BUGFRAME_NR; id++ )
>>> + {
>>> + start = (struct bug_frame *)bug_frames[id];
>>> + end = (struct bug_frame *)bug_frames[id + 1];
>>
>> Nit: Stray double blanks. But I'd like to suggest that you get away
>> without casts here in the first place. Such casts are always a
>> certain
>> risk going forward.
> Do you mean that it is better to re-write bug_frame[] to:
> struct bug_frane bug_frames[] = {
> &__start_bug_frame[0],
> ...
Yes - the fewer casts the better. Also as per above, as much const as
possible. And I expect the array can actually also be static rather
than living on the stack.
>>> + while ( start != end )
>>> + {
>>> + if ( (vaddr_t)bug_loc(start) == pc )
>>> + {
>>> + bug = start;
>>> + goto found;
>>> + }
>>> +
>>> + start++;
>>> + }
>>> + }
>>> +
>>> + found:
>>> + if ( bug == NULL )
>>> + return -ENOENT;
>>> +
>>> + if ( id == BUGFRAME_run_fn )
>>> + {
>>> + void (*fn)(const struct cpu_user_regs *) = (void *)regs-
>>>> BUG_FN_REG;
>>> +
>>> + fn(regs);
>>> +
>>> + goto end;
>>> + }
>>> +
>>> + /* WARN, BUG or ASSERT: decode the filename pointer and line
>>> number. */
>>> + filename = bug_file(bug);
>>> + lineno = bug_line(bug);
>>> +
>>> + switch ( id )
>>> + {
>>> + case BUGFRAME_warn:
>>> + /*
>>> + * TODO: change early_printk's function to early_printk
>>> with format
>>> + * when s(n)printf() will be added.
>>> + */
>>> + early_printk("Xen WARN at ");
>>> + early_printk(filename);
>>> + early_printk(":");
>>> + // early_printk_hnum(lineno);
>>
>> What's this? At the very least the comment is malformed.
> It's an old code that should be removed.
Removed? I.e. the line number will never be logged?
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |