Hi Alistair,

One clarification: The unification of architectures is also going to allow
multi-arch CPUs (RV32/RV64) in a single machine instance? Or it's just
limited to only one in the runtime.

Rahul

On Tue, Sep 7, 2021 at 1:37 PM Ruinland ChuanTzu Tsai <
ruinl...@andestech.com> wrote:

> Hi Alistair,
>
> Thanks for the comment.
>
> On Mon, Sep 06, 2021 at 05:55:25PM +1000, Alistair Francis wrote:
> > On Mon, Sep 6, 2021 at 5:37 PM Ruinland ChuanTzu Tsai
> > <ruinl...@andestech.com> wrote:
> > >
> > > Hi Alistair,
> > >
> > > So glad to hear from you.
> > >
> > > On Mon, Sep 06, 2021 at 05:05:16PM +1000, Alistair Francis wrote:
> > > > On Mon, Sep 6, 2021 at 4:49 PM Ruinland ChuanTzu Tsai
> > > > <ruinl...@andestech.com> wrote:
> > > > >
> > > > >
> > > > > Hi Alistair,
> > > > >
> > > > > Thanks for the heads up about the upcoming unification of RISC-V
> 32/64 targets.
> > > > > Yet I have several concerns and would like to have some
> brainstorming regarding
> > > > > such topics - -
> > > >
> > > > No worries, I'm happy to discuss.
> > > >
> > > > >
> > > > > That is, could you elaborate more about the "runtime check/switch"
> which you
> > > > > mentioned in the previous e-mail :
> > > > >
> https://lists.nongnu.org/archive/html/qemu-devel/2021-08/msg02154.html
> > > > > I'm not quite following the context.
> > > >
> > > > Yep, so something along the lines of this in `riscv_csrrw()`
> > > >
> > > > if (cpu == "MyCustomCPU") {
> > > >     my_custom_csr[csrno].read();
> > > > }
> > > >
> > > > So we check if using the CPU then apply extra CSR accesses.
> > > >
> > > > > If we don't have a way to toggle which (vendor) cores, which will
> be used,
> > > > > during compile time, it means that we have to build all the vendor
> code and
> > > > > link them all together; and we might have the chance to encounter
> collision on
> > > > > csrno between different vendors.
> > > >
> > > > I don't see how they will collide as we will only act on 1, based on
> > > > the CPU we are using.
> > >
> > > AFAIK, we need to put CSR number into `target/riscv/cpu_bits.h`, and
> they are
> > > exposed to the global and let others to use it. With my current
> design, which I
> > > have sent out by RFC patch series v3, I introduced an abstraction
> layer,
> > > `custom_cpu_bits.h`, which will toggle diffenet set of custom CSR
> number.
> > >
> > > If we teardown the Kconfig, all symbols will be exposed and then it
> could have
> > > a high chance to collide with each other.
> >
> > I guess this depends on what you are trying to do.
> >
> > We could have non public CSRs. So each CPU could have it's own custom
> > version of `riscv_csr_operations csr_ops[CSR_TABLE_SIZE]` which is in
> > it's own C file. We then just add a switch case to CSR accesses and if
> > using CPU "customcpu" then we check the `custom_cpu_csr_ops` table.
> > NOTE: That we can do something smarter than a switch, but you get the
> > point. We can implement a read/write function for every element in the
> > array, with the default just triggering an illegal instruction.
>
> One thing I would like to discuss here.
>
> Firstly, I'm not quite sure how the picture of non-public CSR looks like.
> Is it suggested that non-standard CSR number shall not be exposed ?
>
> I know that we should focus on custom CSR part, yet I need to make sure
> that if following logic is permitted to appear in
> `target/riscv/trans_insn` :
>
> trans_vendor_A_insn_blah(...) {
>     riscv_csrrw(env, CSR_VENDOR_A_CUSTOM, r, n, write_mask);
>     }
>
> As far as I know, csr number is not presented as a C++ enum, which we
> can access via csr::custom::vendora::foobar, so it's a globally exposed
> macro with possiblilty of collision.
>
> IMHO, the key is that are we permitted to have a uniform interface to
> access
> CSR, either standard or vendor designed ones, in other parts of QEMU.
>
>
> > I guess that assumes that each CSR access is self contained. For
> > example if changing a custom CSR changes a core part of the
> > target/riscv code this won't really work.
> >
> > On the other hand I'm not convinced we want vendor changes to affect
> > the core target/riscv code. Ideally all vendor code can be kept in
> > it's own file and it's fully self contained. That won't work for
> > everything, but it should work for enough use cases. We can even have
> > a custom vendor state that the vendor code can use (it can also change
> > the CPU state).
> >
> > Does that make sense?
>
> In general, I agree with the point that vendor code should be
> self-contained.
> Yet I have doubts that with the current design of CPU model, are we able to
> unify the targets and in the meanwhile to keep things tight and neat ?
>
> The execution flow will be bonded to have a shared instruction decoder/
> translator and a shared handler for CSR (i.e. riscv_csrrw). It's not like
> we
> get to choose what decoder we want to use or which CSR table we will be
> using at xxx_cpu_init(). If we choose to use runtime check/diversion of
> all of
> these parts, the overhead might be tremendous.
>
> Surely we should be focusing on CSR part for now, and just as you said, CSR
> is not that perforamnce-centric.
>
> Yet if we take a look at `configs/targets`, still we're having 6 MIPS32/64
> linux-user targets, 4 ARM32/64 linux-user targets and 4 PPC32/64 linux-user
> targets.
>
> I guess it will be a very long journey to merge all the variants.
>
> >
> > >
> > > >
> > > > >
> > > > > Secondly, I'm not quite sure about how we're going to merge decode
> tree files
> > > > > across RV32 and RV64. Vendor-designed custom instruction would
> have a different
> > > > > encoding scheme on bitfields for RV32 and RV64. Currently, we
> (Andes) are using
> > > > > different decodetree sources for gen32 and gen64 in
> `target/riscv/meson.build`.
> > > >
> > > > Ok, so custom instructions are a whole different problem. I think we
> > > > should leave that for now and focus on CSRs.
> > > >
> > > > A quick look though and I suspect we could do a similar CPU check in
> > > > decode_opc(). Dealing with the decodetree will be problematic though.
> > > >
> > > > > I'm preparing the patch to demonstrate such hiccups.
> > > > >
> > > > > As far as I know, there's no control flow logic for decodetree to
> parse
> > > > > decodetree files differently. (e.g. ifdef XLEN == 32 then blah,
> blah).
> > > > >
> > > > > To meet in the halfway, maybe after the grand unification on
> RV32/64, we can
> > > > > still confine vendor custom logic (i.e. instrucions and CSRs) to
> be toggled by
> > > > > whether a certain vendor cpu model is selected ?
> > > >wtih  the d
> > > > I honestly don't see a scenario where that happens. The maintenance
> > > > overhead and confusion of changing the CPUs at build time is too
> high.
> > > >
> > > > I also don't think we should need that for CSR accesses. Custom
> > > > instructions are a whole different can of worms.
> > >
> > > IMHO, custom CSR and custom instructions are two sides of a same coin
> in some
> > > way. Let me explain it with an example - -
> > >
> > > Andes has a custom instruction called `EXEC.IT`, which is a 16-bit
> long com-
> > > pressed instruction. By executing such instrcution, an instruction
> table
> > > reside in a particular address specified by a custom CSR called uitb
> will be
> > > fetch, decode and execute. By doing so, the code size could be reduced.
> >
> > Hmmm... This is a much more complex use case than I was expecting. I
> > have been thinking more about custom CSRs to set a timer or control
> > the interrupt controller.
> >
> > Something like what you described is going to be a lot more work.
> >
> > In your case though I think we can still focus on the CSR aspect
> > first. Once that is sorted we can then look at the instruction part.
>
> Just like the mentioned question above , I'm wondering if we can assume
> riscv_csrrw() to be a general interface for accessing all the CSRs ?
>
> Cordially yours,
> Ruinland ChuanTzu Tsai
>
> > The main aim should be that all (or almost all) vendor code lives in
> > it's own file.
> >
> > Alistair
> >
> > >
> > > The problem is that we have different address encoding on RV32 and
> RV64.
> > >
> > > And just like you mentioned, in our in-house core, we apply the same
> logic on
> > > decode_opc() to decode custom instructions first. If such
> decoding/trans
> > > procedure fails, the original decoder will be invoked.
> > >
> > > >
> > > > >
> > > > > By the way, I'm wondering how our friends from T-Head (Guo Ren ?)
> regard this
> > > > > issue ? AFAIK, they forked QEMU from v3.2.0 and applied their
> vendor features
> > > > > on top of it for quite a while.
> > > >
> > > > I'm not sure.
> > >
> > > Sorry for the confusion, I was trying to ping Guo Ren :-D
> > > I CC'ed him in the previous e-mail.
> > >
> > > Cordially yours,
> > > Ruinland ChuanTzu Tsai
> > >
> > > >
> > > > Alistair
> > > >
> > > > >
> > > > > Cordially yours,
> > > > > Ruinland ChuanTzu Tsai
> > > > >
> > > > > On Thu, Sep 02, 2021 at 12:25:20PM +1000, Alistair Francis wrote:
> > > > > > On Fri, Aug 27, 2021 at 1:16 AM Ruinland Chuan-Tzu Tsai
> > > > > > <ruinl...@andestech.com> wrote:
> > > > > > >
> > > > > > > From: Ruinland ChuanTzu Tsai <ruinl...@andestech.com>
> > > > > > >
> > > > > > > During my modification on my previous patch series for custom
> CSR support, I
> > > > > > > believe this issue deserves its own discussion (or debate)
> because it's _not_
> > > > > > > as simple as "just put those options in Kconfig".
> > > > > > >
> > > > > > > The obstables I've encountered and the kluges I came up is
> listed as follow :
> > > > > > >
> > > > > > > (1) Due to the design of top-level meson.build, all Kconfig
> options will land
> > > > > > > into `*-config-devices.h` since minikconf will be only used
> after config_target
> > > > > > > being processed. This will let to the fact that linux-users
> won't be able to
> > > > > > > use custom CSR code properly becuase they only includes
> `*-config-devices.h`.
> > > > > > > And that is reasonble due to the fact that changes on cpu.c
> and csr.c is a
> > > > > > > target-related matter and linux-user mode shouldn't include
> device related
> > > > > > > headers in most of cases.
> > > > > > >
> > > > > > > So, modify meson.build to parse target/riscv/Kconfig during
> config_target phase
> > > > > > > is without doubts necessary.
> > > > > > >
> > > > > > > (2) Kconfig option `RISCV_CUSTOM_CSR` is introduced for RISC-V
> cpu models to
> > > > > > > toggle it at its will. Yet due to the fact that csr.o and
> cpu.o are linked
> > > > > > > altogether for all CPU models, the suffer will be shared
> without option.
> > > > > > > The only reasonable way to seperate build the fire lane which
> seperates vendor
> > > > > > > flavored cpu and spec-conformed ones, is to build them
> seperately with options
> > > > > > > toggled diffrently, just like RV32 and RV64 shares almost the
> same source base,
> > > > > > > yet the sources are compiled with differnt flags/definitions.
> > > > > > >
> > > > > > > To achieve that, miraculously, we can just put *.mak files
> into `target`
> > > > > > > directoy, because that's how `configure` enumerates what
> targets are supported.
> > > > > > >
> > > > > > > (3) The longest days are not over yet, if we take a good look
> at how the minikconf
> > > > > > > is invoked during config_devices and in what way *.mak
> presented its options
> > > > > > > inside `default-configs/devices`, we can see that *.mak files
> there is formated
> > > > > > > in `CONFIG_*` style and the minikconf is reading directly
> during config_device
> > > > > > > phase. That's totally different from *.mak files presented in
> > > > > > > `default-configs/targets`. To make the parsing logic
> consistent, I
> > > > > > > introduce a rv_custom directory inside which contains
> minikconf-parsable
> > > > > > > mak files.
> > > > > > >
> > > > > > > With this patches, ones can build a A25/AX25 linux-user
> platform by :
> > > > > > > $ ./configure
> --target-list=riscv64-andes-linux-user,riscv32-andes-linux-user
> > > > > >
> > > > > > Hey! Thanks for the patches
> > > > > >
> > > > > > I'm not convinced that we want this though.
> > > > > >
> > > > > > Right now we are trying to head towards a riscv64-softmmu binary
> being
> > > > > > able to run all RISC-V code. That include 32-bit cpus
> > > > > > (qemu-riscv64-softmmu -cpu r32...) and 64-bit CPUs. We shouldn't
> be
> > > > > > splitting out more targets.
> > > > > >
> > > > > > It also goes against the general idea of RISC-V in that everyone
> has a
> > > > > > standard compliant implementation, they can then add extra
> > > > > > functionality.
> > > > > >
> > > > > > In terms of Kconfig options. It doesn't seem like a bad idea to
> have
> > > > > > an option to fully disable custom CSRs. That way if someone
> really
> > > > > > wants performance and doesn't want custom CSRs they can disable
> the
> > > > > > switch. Otherwise we leave it on and all custom CSRs are
> available in
> > > > > > the build and then controlled by the CPU selection at runtime.
> If that
> > > > > > ends up being too difficult to implement though then we don't
> have to
> > > > > > have it.
> > > > > >
> > > > > > Thanks again for working on this.
> > > > > >
> > > > > > Alistair
> > > > > >
> > > > > >
> > > > > > > $ make
> > > > > > >
> > > > > > > P.S. The pacthes from :
> > > > > > >
> https://lists.gnu.org/archive/html/qemu-devel/2021-08/msg00913.html
> > > > > > > is needed. A clean-up and modified version will be sent out
> soon.
> > > > > > >
> > > > > > > P.P.S.
> > > > > > > I know these parts won't be easy to digest, and the further
> iterations will be
> > > > > > > needed, so I didn't ask my colleagues to sign-off for now.
> > > > > > >
> > > > > > > Cordially yours,
> > > > > > > Ruinland ChuanTzu Tsai
> > > > > > >
> > > > > > > Ruinland ChuanTzu Tsai (2):
> > > > > > >   Adding Kconfig options for custom CSR support and Andes CPU
> model
> > > > > > >   Adding necessary files for Andes platforms, cores to enable
> custom CSR
> > > > > > >     support
> > > > > > >
> > > > > > >  Kconfig                                       |  1 +
> > > > > > >  .../devices/riscv32-andes-softmmu.mak         | 17
> ++++++++++++
> > > > > > >  .../devices/riscv64-andes-softmmu.mak         | 17
> ++++++++++++
> > > > > > >  .../targets/riscv32-andes-linux-user.mak      |  1 +
> > > > > > >  .../targets/riscv32-andes-softmmu.mak         |  1 +
> > > > > > >  .../targets/riscv64-andes-linux-user.mak      |  1 +
> > > > > > >  .../targets/riscv64-andes-softmmu.mak         |  1 +
> > > > > > >  .../targets/rv_custom/no_custom.mak           |  0
> > > > > > >  .../rv_custom/riscv32-andes-linux-user.mak    |  1 +
> > > > > > >  .../rv_custom/riscv32-andes-softmmu.mak       |  1 +
> > > > > > >  .../targets/rv_custom/riscv32-linux-user.mak  |  1 +
> > > > > > >  .../targets/rv_custom/riscv32-softmmu.mak     |  1 +
> > > > > > >  .../rv_custom/riscv64-andes-linux-user.mak    |  1 +
> > > > > > >  .../rv_custom/riscv64-andes-softmmu.mak       |  1 +
> > > > > > >  .../targets/rv_custom/riscv64-linux-user.mak  |  1 +
> > > > > > >  .../targets/rv_custom/riscv64-softmmu.mak     |  1 +
> > > > > > >  meson.build                                   | 26
> +++++++++++++++++++
> > > > > > >  target/riscv/Kconfig                          |  6 +++++
> > > > > > >  18 files changed, 79 insertions(+)
> > > > > > >  create mode 100644
> default-configs/devices/riscv32-andes-softmmu.mak
> > > > > > >  create mode 100644
> default-configs/devices/riscv64-andes-softmmu.mak
> > > > > > >  create mode 120000
> default-configs/targets/riscv32-andes-linux-user.mak
> > > > > > >  create mode 120000
> default-configs/targets/riscv32-andes-softmmu.mak
> > > > > > >  create mode 120000
> default-configs/targets/riscv64-andes-linux-user.mak
> > > > > > >  create mode 120000
> default-configs/targets/riscv64-andes-softmmu.mak
> > > > > > >  create mode 100644
> default-configs/targets/rv_custom/no_custom.mak
> > > > > > >  create mode 100644
> default-configs/targets/rv_custom/riscv32-andes-linux-user.mak
> > > > > > >  create mode 100644
> default-configs/targets/rv_custom/riscv32-andes-softmmu.mak
> > > > > > >  create mode 120000
> default-configs/targets/rv_custom/riscv32-linux-user.mak
> > > > > > >  create mode 120000
> default-configs/targets/rv_custom/riscv32-softmmu.mak
> > > > > > >  create mode 100644
> default-configs/targets/rv_custom/riscv64-andes-linux-user.mak
> > > > > > >  create mode 100644
> default-configs/targets/rv_custom/riscv64-andes-softmmu.mak
> > > > > > >  create mode 120000
> default-configs/targets/rv_custom/riscv64-linux-user.mak
> > > > > > >  create mode 120000
> default-configs/targets/rv_custom/riscv64-softmmu.mak
> > > > > > >  create mode 100644 target/riscv/Kconfig
> > > > > > >
> > > > > > > --
> > > > > > > 2.32.0
> > > > > > >
>
>

Reply via email to