note out-of-date
[libreriscv.git] / isa_conflict_resolution.mdwn
index 9cd047b4367c45538692a6dda11cd995bf2bc265..0b099cc7514c5eda3d6a751d9107263cacf6bba8 100644 (file)
@@ -1,5 +1,40 @@
 # Resolving ISA conflicts and providing a pain-free RISC-V Standards Upgrade Path
 
+**Note: out-of-date as of review 31apr2018, requires updating to reflect
+"mvendorid-marchid-isamux" concept.**
+
+## Executive Summary
+
+A non-invasive backwards-compatible change to make mvendorid and marchid
+being read-only to be a formal declaration of an architecture having no
+Custom Extensions, and being permitted to be WARL in order to support
+multiple simultaneous architectures on the same processor (or per hart
+or harts) permits not only backwards and forwards compatibility with
+existing implementations of the RISC-V Standard, not only permits seamless
+transitions to future versions of the RISC-V Standard (something that is
+not possible at the moment), but fixes the problem of clashes in Custom
+Extension opcodes on a global worldwide permanent and ongoing basis.
+
+Summary of impact and benefits:
+
+* Implementation impact for existing implementations (even though
+  the Standard is not finalised) is zero.
+* Impact for future implementations compliant with (only one) version of the
+  RISC-V Standard is zero.
+* Benefits for implementations complying with (one or more) versions
+  of the RISC-V Standard is: increased customer acceptance due to
+  a smooth upgrade path at the customer's pace and initiative vis-a-vis
+  legacy proprietary software.
+* Benefits for implementations deploying multiple Custom Extensions
+  are a massive reduction in NREs and the hugely reduced ongoing software
+  toolchain maintenance costs plus the benefit of having security updates
+  from upstream software sources due to
+  *globally unique identifying information* resulting in zero binary
+  encoding conflicts in the toolchains and resultant binaries
+  *even for Custom Extensions*.
+
+## Introduction
+
 In a lengthy thread that ironically was full of conflict indicative
 of the future direction in which RISC-V will go if left unresolved,
 multiple Custom Extensions were noted to be permitted free rein to
@@ -235,20 +270,27 @@ turn the custom instruction into an actual binary-encoding (plus
 binary-encoding of the context-switching information).  (**TBD, Jacob,
 separate page?  review this para?**)
 
-# mvendorid/marchid WARL
+# mvendorid/marchid WARL <a name="mvendor_marchid_warl"></a>
 
 (Summary: the only idea that meets the full requirements.  Needs
  toolchain backup, but only when the first chip is released)
 
+This proposal has full details at the following page:
+[[mvendor_march_warl]]
+
 Coming out of the software-related proposal by Jacob Bachmeyer, which
 hinged on the idea of a globally-maintained gcc / binutils database
 that kept and coordinated architectural encodings (curated by the Free
 Software Foundation), was to quite simply make the mvendorid and marchid
-CSRs have WARL (writeable) characteristics.  For instances where mvendorid
-and marchid are readable, that would be taken to be a Standards-mandatory
-"declaration" that the architecture has *no* Custom Extensions (and that
-it conforms precisely to one and only one specific variant of the
-RISC-V Specification).
+CSRs have WARL (writeable) characteristics.  Read-only is taken to
+mean a declaration of "Having no Custom Extensions" (a zero-impact
+change).
+
+By making mvendorid-marchid tuples WARL the instruction decode phase
+may re-route mutually-exclusively to different engines, thus providing
+a controlled means and method of supporting multiple (future, past and
+present) versions of the **Base** ISA, Custom Extensions and even
+completely foreign ISAs in the same processor.
 
 This incredibly simple non-invasive idea has some unique and distinct
 advantages over other proposals:
@@ -270,71 +312,20 @@ advantages over other proposals:
   an inner loop, with a single instruction (to the WARL register)
   changing the meaning.
 
-A couple of points were made:
-
-* Compliance Testing may **fail** any system that has mvendorid/marchid
-  as WARL.  This however is a clear case of "Compliance Tail Wagging Standard
-  Dog".
-* The redirection of meaning of certain binary encodings to multiple
-  engines was considered extreme, eyebrow-raising, and also (importantly)
-  potentially expensive, introducing significant latency at the decode
-  phase.
-
-On this latter point, it was observed that MISA already switches out entire
-sets of instructions (interacts at the "decode" phase).  The difference
-between what MISA does and the mvendor/march-id WARL idea is that whilst
-MISA only switches instruction decoding on (or off), the WARL idea
-*redirects* encoding, to *different* engines, fortunately in a deliberately
-mutually-exclusive fashion.
-
-Implementations would therefore, in each Extension (assuming one separate
-"decode" engine per Extension), simply have an extra (mutually-exclusively
-enabled) wire in the AND gate for any given binary encoding, and in this
-way there would actually be very little impact on the latency.  The assumption
-here is that there are not dozens of Extensions vying for the same binary
-encoding (at which point the Fabless Semi Company has other much more
-pressing issues to deal with that make resolving encoding conflicts trivial
-by comparison).
-
-Also pointed out was that in certain cases pipeline stalls could be introduced
-during the switching phase, if needed, just as they may be needed for
-correct implementation of (mandatory) support for MISA.
-
 **This is the only one of the proposals that meet the full requirements**
 
-# ioctl-like
+# ioctl-like <a name="ioctl-like"></a>
 
 (Summary: good solid orthogonal idea.  See [[ioctl]] for full details)
 
+NOTE: under discussion.
+
 This proposal basically mirrors the concept of POSIX ioctls, providing
 (arbitrarily) 8 functions (opcodes) whose meaning may be over-ridden
 in an object-orientated fashion by calling an "open handle" (and close)
 function (instruction) that switches (redirects) the 8 functions over to
 different opcodes.
 
-The "open handle" opcode takes a GUID (globally-unique identifier)
-and an ioctl number, and stores the UUID in a table indexed by the
-ioctl number:
-
-    handle_global_state[8] # stores UUID or index of same 
-
-    def open_handle(uuid, ioctl_num): 
-          handle_global_state[ioctl_num] = uuid 
-
-    def close_handle(ioctl_num): 
-          handle_global_state[ioctl_num] = -1 # clear table entry
-
-"Ioctls" (arbitrarily 8 separate R-type opcodes) then perform a redirect
-based on what the global state for that numbered "ioctl" has been set to:
-
-    def ioctl_fn0(*rargs): # star means "take all arguments as a tuple"
-        if handle_global_state[0] == CUSTOMEXT1UUID: 
-           CUSTOMEXT1_FN0(*rargs) # apply all arguments to function 
-        elif handle_global_state[0] == CUSTOMEXT2UUID: 
-           CUSTOMEXT2_FN0(*rargs) # apply all arguments to function 
-        else:
-            raise Exception("undefined opcode")
-
 The proposal is functionally near-identical to that of the mvendor/march-id
 except extended down to individual opcodes.  As such it could hypothetically
 be proposed as an independent Standard Extension in its own right that extends
@@ -342,6 +333,10 @@ the Custom Opcode space *or* fits into the brownfield spaces within the
 existing ISA opcode space *or* is used as the basis of an independent
 Custom Extension in its own right.
 
+==RB==
+I really think it should be in browncode
+==RB==
+
 One of the reasons for seeking an extension of the Custom opcode space is
 that the Custom opcode space is severely limited: only 2 opcodes are free
 within the 32-bit space, and only four total remain in the 48 and 64-bit
@@ -356,6 +351,55 @@ invasive than the mvendor/march-id WARL concept.
 
 TBD: placeholder as of 26apr2018
 
+## new (old) m-a-i tuple idea
+
+> actually that's a good point: where the user decides that they want
+> to boot one and only one tuple (for the entire OS), forcing a HARDWARE
+> level default m-a-i tuple at them actually prevents and prohibits them
+> from doing that, Jacob.
+> 
+> so we have apps on one RV-Base ISA and apps on an INCOMPATIBLE (future)
+> variant of RV-Base ISA.  with the approach that i was advocating (S-mode
+> does NOT switch automatically), there are totally separate mtvec /
+> stvec / bstvec traps.
+> 
+> would it be reasonable to assume the following:
+> 
+> (a) RV-Base ISA, particularly code-execution in the critical S-mode
+> trap-handling, is *EXTREMELY* unlikely to ever be changed, even thinking
+> 30 years into the future ?
+> 
+> (b) if the current M-mode (user app level) context is "RV Base ISA 1"
+> then i would hazard a guess that S-mode is prettty much going to drop
+> down into *exactly* the same mode / context, the majority of the time
+> 
+> thus the hypothesis is that not only is it the common code-path to *not*
+> switch the ISA in the S-mode trap but that the instructions used are
+> extremely unlikely to be changed between "RV Base Revisions".
+> 
+> foreign isa hardware-level execution
+> ------------------------
+> 
+> this is the one i've not really thought through so much, other than it
+> would clearly be disadvantageous for S-mode to be arbitrarily restricted
+> to running RV-Base code (of any variant).  a case could be made that by the
+> time the m-a-i tuple is switched to the foreign isa it's "all bets off",
+> foreign arch is "on its own", including having to devise a means and
+> method to switch back (equivalent in its ISA of m-a-i switching).
+> 
+> conclusion / idea
+> --------------------
+> 
+> the multi-base "user wants to run one and only one tuple" is the key
+> case, here, that is a show-stopper to the idea of hard-wiring the default
+> S-mode m-a-i.
+> 
+> now, if instead we were to say, "ok so there should be a default S-mode
+> m-a-i tuple" and it was permitted to SET (choose) that tuple, *that*
+> would solve that problem.  it could even be set to the foreign isa. 
+> which would be hilarious.
+
+
 # Summary and Conclusion
 
 In the early sections (those in the category "no action") it was established
@@ -406,16 +450,22 @@ and is the only idea that meets the three requirements:
   (at all) that could cost them immediate short-term profits.**
   (met because existing implementations, with the exception of those
   that have Custom Extensions, come under the "vendor/arch-id read only
-  is a declaration of having no Custom Extensions" fall-back category)
+  is a formal declaration of an implementation having no Custom Extensions"
+  fall-back category)
 
 So to summarise:
 
 * The consequences of not tackling this are severe: the RISC-V Foundation
   cannot take a back seat.  If it does, clear historical precedent shows
   100% what the outcome will be (1).
+* Making the mvendorid and marchid CSRs WARL solves the problem in a
+  minimal to zero-disruptive backwards-compatible fashion that provides
+  indefinite transparent *forwards*-compatibility.
 * The retro-fitting cost onto existing implementations (even though the
-  specification has not been finalised) is negligeable
-  (changes to words in the specification)
+  specification has not been finalised) is zero to negligeable
+  (only changes to words in the specification required at this time:
+  no vendor need discard existing designs, either being designed,
+  taped out, or actually in production).
 * The benefits are clear (pain-free transition path for vendors to safely
   upgrade over time; no fights over Custom opcode space; no hassle for
   software toolchain; no hassle for GNU/Linux Distros)
@@ -424,10 +474,13 @@ So to summarise:
   an extreme unlikely outlier).
 * Compliance Testing is straightforward and allows vendors to seek and
   obtain *multiple* Compliance Certificates with past, present and future
-  variants of the RISC-V Standard (in the exact same processor), in order
-  support legacy customers and provide same customers with a way to avoid
-  "impossible-to-make" decisions that throw out ultra-expensive multi-decade
-  proprietary legacy software at the same as the hardware.
+  variants of the RISC-V Standard (in the exact same processor,
+  simultaneously), in order to support end-customer legacy scenarios and
+  provide the same with a way to avoid "impossible-to-make" decisions that
+  throw out ultra-costly multi-decade-investment in proprietary legacy
+  software at the same as the (legacy) hardware.
+
+-------
 
 # Conversation Exerpts
 
@@ -475,8 +528,14 @@ The following conversation exerpts are taken from the ISA-dev discussion
 > it is implementing. It will test nothing in the custom extension space,
 > and doesn't monitor or care what is in that space.
 
+## (4) Jacob Bachmeyer on explaining disambiguation of opcode space
+
+> ...have different harts with different sets of encodings.)  Adding a "select"
+> CSR as has been proposed does not escape this fundamental truth that
+> instruction decode must be unambiguous, it merely expands every opcode with
+> extra bits from a "select" CSR.
+
 # References
 
 * <https://groups.google.com/a/groups.riscv.org/forum/#!topic/isa-dev/7bbwSIW5aqM>
 * <https://groups.google.com/a/groups.riscv.org/forum/#!topic/isa-dev/InzQ1wr_3Ak%5B1-25%5D>
-