qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Richard Henderson <richard.henderson@linaro.org>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: marex@denx.de, amir.gonnen@neuroblade.ai, qemu-devel@nongnu.org
Subject: Re: [PATCH v4 17/33] target/nios2: Prevent writes to read-only or reserved control fields
Date: Tue, 8 Mar 2022 10:45:46 -1000	[thread overview]
Message-ID: <f80be14d-d3d4-b3d7-0b0a-3fc28f7e28ac@linaro.org> (raw)
In-Reply-To: <CAFEAcA-y3H1GP9TFDoUsLTMNWMe0SnVAXHyM2scaRyCafD=Y=w@mail.gmail.com>

On 3/8/22 10:24, Peter Maydell wrote:
> On Tue, 8 Mar 2022 at 07:20, Richard Henderson
> <richard.henderson@linaro.org> wrote:
>>
>> Create an array of masks which detail the writable and readonly
>> bits for each control register.  Apply them when writing to
>> control registers.
>>
>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> 
>> diff --git a/target/nios2/cpu.c b/target/nios2/cpu.c
>> index f2813d3b47..189adf111c 100644
>> --- a/target/nios2/cpu.c
>> +++ b/target/nios2/cpu.c
>> @@ -88,6 +88,55 @@ static void nios2_cpu_initfn(Object *obj)
>>
>>       cpu_set_cpustate_pointers(cpu);
>>
>> +    /* Begin with all fields of all registers are reserved. */
>> +    memset(cpu->cr_state, 0, sizeof(cpu->cr_state));
>> +
>> +    /*
>> +     * The combination of writable and readonly is the set of all
>> +     * non-reserved fields.  We apply writable as a mask to bits,
>> +     * and merge in existing readonly bits, before storing.
>> +     */
>> +#define WR_REG(C)       cpu->cr_state[C].writable = -1
>> +#define RO_REG(C)       cpu->cr_state[C].readonly = -1
>> +#define WR_FIELD(C, F)  cpu->cr_state[C].writable |= R_##C##_##F##_MASK
>> +#define RO_FIELD(C, F)  cpu->cr_state[C].readonly |= R_##C##_##F##_MASK
>> +
>> +    WR_FIELD(CR_STATUS, PIE);
> 
> I think you need to claim (CR_STATUS, RSIE) is a RO bit, because without
> EIC it's should-be-one.

That's patch 19.

> 
>> +    WR_REG(CR_ESTATUS);
>> +    WR_REG(CR_BSTATUS);
>> +    RO_REG(CR_CPUID);
>> +    WR_FIELD(CR_EXCEPTION, CAUSE);
>> +    WR_REG(CR_BADADDR);
>> +
>> +    /* TODO: These control registers are not present with the EIC. */
>> +    WR_REG(CR_IENABLE);
>> +    RO_REG(CR_IPENDING);
> 
> Missing CR_CONFIG register ?

Present with MPU or ECC, and we implement neither.  Perhaps these should be listed below 
with the TODO?

> 
>> +
>> +    if (cpu->mmu_present) {
>> +        WR_FIELD(CR_STATUS, U);
>> +        WR_FIELD(CR_STATUS, EH);
> 
> True by the documentation, but we don't seem to prevent EH from
> being set to 1 when we take an exception on the no-MMU config...

Yeah, I noticed this when cleaning things up in patch 28, but didn't want to change things 
too much in that patch.  I also don't have a no-mmu kernel to test against.

>> +        WR_FIELD(CR_TLBMISC, WR);
> 
> (the docs call this field 'WE', incidentally)

Yeah, noticed that and meant to fix it, but forgot.

>> +        WR_FIELD(CR_TLBMISC, RD);
> 
> If you claim this bit to be writable you'll allow the gdbstub
> to set it, which is probably not what you want. (Actual writes to
> this register are handled via the helper function.)

Mm.  Perhaps calling it reserved is the easiest way out of that.  For these mmu registers, 
we don't apply the two masks, but pass it all to the helper.  I'm open to ideas there.

>> +        WR_FIELD(CR_TLBMISC, WAY);
> 
> Missing PID field ?

Yep, thanks.

>> +        WR_REG(CR_TLBACC);
> 
>> +    }
> 
> You don't enforce the reserved/readonly bits on status when
> we copy it from estatus during eret. (That change appears later,
> in patch 26.)

Yep.  I could move the masking back to this patch, leave only the estatus/sstatus change 
to patch 26.

> The same *ought* to apply for bret, except that we have a bug in
> our implementation of it, where we fail to copy bstatus into status...

Hah, thanks, yes.


r~


  reply	other threads:[~2022-03-08 20:46 UTC|newest]

Thread overview: 77+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-08  7:19 [PATCH v4 00/33] target/nios2: Shadow register set, EIC and VIC Richard Henderson
2022-03-08  7:19 ` [PATCH v4 01/33] target/nios2: Check supervisor on eret Richard Henderson
2022-03-08  7:19 ` [PATCH v4 02/33] target/nios2: Stop generating code if gen_check_supervisor fails Richard Henderson
2022-03-08  9:48   ` Peter Maydell
2022-03-08  7:19 ` [PATCH v4 03/33] target/nios2: Add NUM_GP_REGS and NUM_CP_REGS Richard Henderson
2022-03-08  9:49   ` Peter Maydell
2022-03-08  7:19 ` [PATCH v4 04/33] target/nios2: Split PC out of env->regs[] Richard Henderson
2022-03-08  9:51   ` Peter Maydell
2022-03-08  7:19 ` [PATCH v4 05/33] target/nios2: Split out helper for eret instruction Richard Henderson
2022-03-08  9:52   ` Peter Maydell
2022-03-08  7:19 ` [PATCH v4 06/33] target/nios2: Do not create TCGv for control registers Richard Henderson
2022-03-08  9:54   ` Peter Maydell
2022-03-08  7:19 ` [PATCH v4 07/33] linux-user/nios2: Trim target_pc_regs to sp and pc Richard Henderson
2022-03-08 10:00   ` Peter Maydell
2022-03-08 19:34     ` Richard Henderson
2022-03-08  7:19 ` [PATCH v4 08/33] target/nios2: Remove cpu_interrupts_enabled Richard Henderson
2022-03-08 10:00   ` Peter Maydell
2022-03-08  7:19 ` [PATCH v4 09/33] target/nios2: Split control registers away from general registers Richard Henderson
2022-03-08 10:04   ` Peter Maydell
2022-03-08  7:19 ` [PATCH v4 10/33] target/nios2: Clean up nios2_cpu_dump_state Richard Henderson
2022-03-08 10:06   ` Peter Maydell
2022-03-08  7:19 ` [PATCH v4 11/33] target/nios2: Use hw/registerfields.h for CR_STATUS fields Richard Henderson
2022-03-08 10:08   ` Peter Maydell
2022-03-08 19:34     ` Richard Henderson
2022-03-08  7:19 ` [PATCH v4 12/33] target/nios2: Use hw/registerfields.h for CR_EXCEPTION fields Richard Henderson
2022-03-08 10:12   ` Peter Maydell
2022-03-08 19:36     ` Richard Henderson
2022-03-08  7:19 ` [PATCH v4 13/33] target/nios2: Use hw/registerfields.h for CR_TLBADDR fields Richard Henderson
2022-03-08 10:14   ` Peter Maydell
2022-03-08  7:19 ` [PATCH v4 14/33] target/nios2: Use hw/registerfields.h for CR_TLBACC fields Richard Henderson
2022-03-08 10:19   ` Peter Maydell
2022-03-08  7:19 ` [PATCH v4 15/33] target/nios2: Use hw/registerfields.h for CR_TLBMISC fields Richard Henderson
2022-03-08 10:46   ` Peter Maydell
2022-03-08 19:37     ` Richard Henderson
2022-03-08  7:19 ` [PATCH v4 16/33] target/nios2: Move R_FOO and CR_BAR into enumerations Richard Henderson
2022-03-08 10:47   ` Peter Maydell
2022-03-08  7:19 ` [PATCH v4 17/33] target/nios2: Prevent writes to read-only or reserved control fields Richard Henderson
2022-03-08 10:57   ` Peter Maydell
2022-03-08 19:49     ` Richard Henderson
2022-03-08 20:24   ` Peter Maydell
2022-03-08 20:45     ` Richard Henderson [this message]
2022-03-08  7:19 ` [PATCH v4 18/33] target/nios2: Implement cpuid Richard Henderson
2022-03-08 10:52   ` Peter Maydell
2022-03-08 19:50     ` Richard Henderson
2022-03-08  7:19 ` [PATCH v4 19/33] target/nios2: Implement CR_STATUS.RSIE Richard Henderson
2022-03-08 10:55   ` Peter Maydell
2022-03-08  7:19 ` [PATCH v4 20/33] target/nios2: Remove CPU_INTERRUPT_NMI Richard Henderson
2022-03-08 10:56   ` Peter Maydell
2022-03-08  7:19 ` [PATCH v4 21/33] target/nios2: Use tcg_constant_tl Richard Henderson
2022-03-08 11:00   ` Peter Maydell
2022-03-08 19:51     ` Richard Henderson
2022-03-08  7:19 ` [PATCH v4 22/33] target/nios2: Introduce dest_gpr Richard Henderson
2022-03-08 11:07   ` Peter Maydell
2022-03-08 20:53     ` Richard Henderson
2022-03-08  7:19 ` [PATCH v4 23/33] target/nios2: Drop CR_STATUS_EH from tb->flags Richard Henderson
2022-03-08 11:08   ` Peter Maydell
2022-03-08  7:19 ` [PATCH v4 24/33] target/nios2: Introduce shadow register sets Richard Henderson
2022-03-09 14:02   ` Amir Gonnen
2022-03-09 18:01     ` Richard Henderson
2022-03-08  7:19 ` [PATCH v4 25/33] target/nios2: Implement rdprs, wrprs Richard Henderson
2022-03-08  7:19 ` [PATCH v4 26/33] target/nios2: Update helper_eret for shadow registers Richard Henderson
2022-03-08  7:19 ` [PATCH v4 27/33] target/nios2: Create EXCP_SEMIHOST for semi-hosting Richard Henderson
2022-03-08 11:24   ` Peter Maydell
2022-03-08  7:20 ` [PATCH v4 28/33] target/nios2: Clean up nios2_cpu_do_interrupt Richard Henderson
2022-03-08  7:20 ` [PATCH v4 29/33] target/nios2: Implement EIC interrupt processing Richard Henderson
2022-03-08  7:20 ` [PATCH v4 30/33] hw/intc: Vectored Interrupt Controller (VIC) Richard Henderson
2022-03-08  8:32   ` Mark Cave-Ayland
2022-03-08 11:27   ` Peter Maydell
2022-03-08 19:53     ` Richard Henderson
2022-03-08  7:20 ` [PATCH v4 31/33] hw/nios2: Introduce Nios2MachineState Richard Henderson
2022-03-08  8:39   ` Mark Cave-Ayland
2022-03-08 19:55     ` Richard Henderson
2022-03-08  7:20 ` [PATCH v4 32/33] hw/nios2: Move memory regions into Nios2Machine Richard Henderson
2022-03-08  8:39   ` Mark Cave-Ayland
2022-03-08  7:20 ` [PATCH v4 33/33] hw/nios2: Machine with a Vectored Interrupt Controller Richard Henderson
2022-03-08  8:43   ` Mark Cave-Ayland
2022-03-08 19:57     ` Richard Henderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f80be14d-d3d4-b3d7-0b0a-3fc28f7e28ac@linaro.org \
    --to=richard.henderson@linaro.org \
    --cc=amir.gonnen@neuroblade.ai \
    --cc=marex@denx.de \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).