Latest additions
[libresoc-isa-manual.git] / powerpc-add / src / isamux.tex
1 % ISAMUX
2 % https://bugs.libre-soc.org/show_bug.cgi?id=214
3
4 \chapter{ISAMUX}
5
6 \paragraph{}
7
8 A fixed number of additional (hidden) bits, conceptually a \textbf{namespace},
9 set by way of a \gls{CSR} or other out-of-band mechanism,
10 that go directly and non-optionally
11 into the instruction decode phase, extending (in each implementation) the
12 opcode length to 16+N, 32+N, 48+N, where N is a hard fixed quantity on
13 a per-implementor basis.
14
15 \paragraph{}
16
17 Where the opcode is normally loaded from the location at the PC, the extra
18 bits, set via a CSR, are mandatorially appended to every instruction: hence why
19 they are described as "hidden" opcode bits, and as a \textbf{namespace}.
20
21 \paragraph{}
22
23 The parallels with c++ \textbf{using namespace} are direct and clear.
24 Alternative conceptual ways to understand this concept include
25 \textbf{escape-sequencing}.
26
27 \paragraph{}
28
29 TODO: reserve some bits which permit the namespace \textbf{escape-sequence} to
30 be relevant for a fixed number of instructions at a time. Caveat:
31 allowing such a countdown to cross branch-points is unwise (illegal
32 instruction?)
33
34 \paragraph{}
35
36 An example of a pre-existing \textbf{namespace} switch that has been in
37 prevalent use for several decades (\gls{SPARC} and other architectures):
38 dynamic runtime selectability of little-endian / big-endian \textbf{meaning}
39 of instructions by way of a \textbf{mode switch} instruction (of some kind).
40
41 \paragraph{}
42
43 That \textbf{switch} is in effect a 33rd (hidden) bit that is part of the opcode,
44 going directly into the mux / decode phase of instruction decode, and
45 thus qualifies categorically as a \textbf{namespace}. This proposal both formalises
46 and generalises that concept.
47
48 \section{Hypothetical Format} \label{hypotheticalformat}
49
50 \paragraph{}
51
52 Note that this is a hypothetical format, yet to be decided, where particular
53 attention needs to be paid to the fact that there is an \textbf{immediate}
54 version of CSRRW (with 5 bits of immediate) that could save a lot of space in
55 binaries.
56
57 \begin{verbatim}
58 3 2 1
59 |1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0|
60 |-------------------------------|-------|---------------------|-|
61 |1 custom custom custom custom custom | foreignarch |1|
62 |0 reserved reserved reserved reserved reserved | foreignarch |1|
63 |custom | reserved | official|B| rvcpage |0|
64 \end{verbatim}
65
66 \paragraph{}
67
68 RV Mode
69
70 \begin{itemize}
71 \parskip 0pt
72 \itemsep 1pt
73
74 \item
75
76 when bit 0 is 0, \textbf{RV} mode is selected.
77
78 \item
79
80 in RV mode, bits 1 thru 5 provide up to 16 possible alternative meanings
81 (namespaces) for 16 Bit opcodes. \textbf{pages} if you will. The top bit
82 indicates custom meanings. When set to 0, the top bit is for official usage.
83
84 \item
85
86 Bits 15 thru 23 are reserved.
87
88 \item
89
90 Bits 24 thru 31 are for custom usage.
91
92 \item
93
94 bit 6 (\textbf{B}) is \gls{endian}-selection: \gls{LE}/\gls{BE}
95
96 \end{itemize}
97
98 \paragraph{}
99
100 16 bit page examples:
101
102 \begin{itemize}
103 \parskip 0pt
104 \itemsep 1pt
105
106 \item
107
108 0b0000 STANDARD (2019) RVC
109
110 \item
111
112 0b0001 RVCv2
113
114 \item
115
116 0b0010 RV16
117
118 \item
119
120 0b0011 RVCv3
121
122 \item
123
124 ...
125
126 \item
127
128 0b1000 custom 16 bit opcode meanings 1
129
130 \item
131
132 0b1001 custom 16 bit opcode meanings 2
133
134 \item
135
136 .....
137
138 \end{itemize}
139
140 \paragraph{}
141
142 Foreign Arch Mode
143
144 \begin{itemize}
145 \parskip 0pt
146 \itemsep 1pt
147
148 \item
149
150 when bit 0 (the \gls{LSB}) is 1, \textbf{Foreign arch} mode is selected.
151 % part of the reason for having LSB here is to avoid glossary ordering problems
152
153 \item
154
155 Bits 1 thru 7 are a table of foreign arches.
156
157 \item
158
159 when the \gls{MSB} is 1, this is for custom use.
160
161 \item
162
163 when the MSB is 0, bits 1 thru 6 are reserved for 64 possible official foreign archs.
164
165 \end{itemize}
166
167 \paragraph{}
168
169 Foreign archs could be (examples):
170
171 \begin{itemize}
172 \parskip 0pt
173 \itemsep 1pt
174
175 \item
176
177 0b0000000 x86\_32
178
179 \item
180
181 0b0000001 x86\_64
182
183 \item
184
185 0b0000010 MIPS32
186
187 \item
188
189 0b0000011 MIPS64
190
191 \item
192
193 ....
194
195 \item
196
197 0b0010000 Java Bytecode
198
199 \item
200
201 0b0010001 N.E.Other Bytecode
202
203 \item
204
205 ....
206
207 \item
208
209 0b1000000 custom foreign arch 1
210
211 \item
212
213 0b1000001 custom foreign arch 2
214
215 \item
216
217 ....
218
219 \end{itemize}
220
221 \paragraph{}
222
223 Note that \textbf{official} foreign archs have a binary value where the MSB is zero,
224 and custom foreign archs have a binary value where the MSB is 1.
225
226 \section{Namespaces are permitted to swap to new state} \label{stateswap}
227
228 \paragraph{}
229
230 In each privilege level, on a change of ISANS (whether through manual setting
231 of ISANS or through trap entry or exit changing the ISANS CSR), an
232 implementation is permitted to completely and arbitrarily switch not only the
233 instruction set, it is permitted to switch to a new bank of CSRs (or a subset
234 of the same), and even to switch to a new PC.
235
236 \paragraph{}
237
238 This to occur immediately and atomically at the point at which the change in ISANS occurs.
239
240 \paragraph{}
241
242 The most obvious application of this is for Foreign Archs, which may have their
243 own completely separate PC. Thus, foreign assembly code and \gls{RISCV} assembly code
244 need not be mixed in the same binary.
245
246 \paragraph{}
247
248 Further use-cases may be envisaged however great care needs to be taken to not
249 cause massive complications for JIT emulation, as the RV ISANS is unary encoded
250 (2\^31 permutations).
251
252 \paragraph{}
253
254 In addition, the state information of \textbf{all} namespaces has to be saved
255 and restored on a context-switch (unless the SP is also switched as part of the
256 state!) which is quite severely burdensome and getting exceptionally complex.
257
258 \paragraph{}
259
260 Switching \gls{CSR}, \gls{PC} (and potentially \gls{SP}) and other state on a NS change in the
261 RISCV unary NS therefore needs to be done wisely and responsibly, i.e.
262 minimised!
263
264 \paragraph{}
265
266 To be discussed. Context
267 href=https://groups.google.com/a/groups.riscv.org/d/msg/isa-dev/\\
268 x-uFZDXiOxY/27QDW5KvBQAJ
269
270
271 \section{Privileged Modes / Traps} \label{privtraps}
272
273 \paragraph{}
274
275 An additional WLRL CSR per priv-level named \textbf{LAST-ISANS} is required, and
276 another called \textbf{TRAP-ISANS}
277 These mirrors the ISANS CSR, and, on a trap, the current ISANS in
278 that privilege level is atomically
279 transferred into LAST-ISANS by the hardware, and ISANS in that trap
280 is set to TRAP-ISANS. Hardware is \textbf{only then} permitted to modify the \gls{PC} to
281 begin execution of the trap.
282
283 \paragraph{}
284
285 On exit from the trap, LAST-ISANS is copied into the ISANS CSR, and
286 LAST-ISANS is set to TRAP-ISANS. \textbf{Only then} is the hardware permitted
287 to modify the PC to begin execution where the trap left off.
288
289 \paragraph{}
290
291 This is identical to how xepc is handled.
292
293 \paragraph{}
294
295 Note 1: in the case of \gls{SupervisorMode} (context switches in particular),
296 saving and changing of LAST-ISANS (to and from the stack) must be done
297 atomically and under the protection of the SIE bit. Failure to do so
298 could result in corruption of LAST-ISANS when multiple traps occur in
299 the same privilege level.
300
301 \paragraph{}
302
303 Note 2: question - should the trap due to illegal (unsupported) values
304 written into LAST-ISANS occur when the \textbf{software} writes to LAST-ISANS,
305 or when the \textbf{trap} (on exit) writes into LAST-ISANS? this latter seems
306 fraught: a trap, on exit, causing another trap??
307
308 \paragraph{}
309
310 Per-privilege-level pseudocode (there exists UISANS, UTRAPISANS, ULASTISANS,
311 MISANS, MTRAPISANS, MLASTISANS and so on):
312
313 \begin{verbatim}
314 trap_entry()
315 {
316 LAST-ISANS = ISANS // record the old NS
317 ISANS = TRAP_ISANS // traps are executed in "trap" NS
318 }
319
320 and trap_exit:
321
322 trap_exit():
323 {
324 ISANS = LAST-ISANS
325 LAST-ISANS = TRAP_ISANS
326 }
327 \end{verbatim}
328
329 \section{Alternative RVC 16 Bit Opcode meanings} \label{alternativervc16bitopcodemeanings}
330
331 \paragraph{}
332
333 Here is appropriate to raise an idea how to cover RVC and future
334 variants, including RV16.
335
336 \paragraph{}
337
338 Just as with foreign archs, and you quite rightly highlight above, it
339 makes absolutely no sense to try to select both RVCv1, v2, v3 and so on,
340 all simultaneously. An unary bit vector for RVC modes, changing the 16
341 BIT opcode space meaning, is wasteful and again has us believe that WARL
342 is the \textbf{solution}.
343
344 \paragraph{}
345
346 The correct thing to do is, again, just like with foreign archs, to
347 treat RVCs as a \textbf{binary} namespace selector. Bits 1 thru 3 would give
348 8 possible completely new alternative meanings, just like how the \gls{Z80}
349 and the 286 and 386 used to do bank switching.
350
351 \paragraph{}
352
353 All zeros is clearly reserved for the present RVC. 0b001 for RVCv2. 0b010
354 for RV16 (look it up) and there should definitely be room reserved here
355 for custom reencodings of the 16 bit opcode space.
356
357 \section{FAQ}\label{faq}
358
359 \subsection{Why not have TRAP-ISANS as a vector table, matching mtvec?} \label{trap-isans-vec}
360
361 \paragraph{}
362
363 Use case to be determined. Rather than be a global per-priv-level value,
364 TRAP-ISANS is a table of length exactly equal to the mtvec/utvec/stvec table,
365 with corresponding entries that specify the assembly-code namespace in which
366 the trap handler routine is written.
367
368 \paragraph{}
369
370 Open question: see https://groups.google.com/a/groups.riscv.org/d/msg/isa\-dev/IAhyOqEZoWA/BM0G3J2zBgAJ
371
372 \begin{verbatim}
373 trap_entry(x_cause)
374 {
375 LAST-ISANS = ISANS // record the old NS
376 ISANS = TRAP_ISANS_VEC[xcause] // traps are executed in "trap" NS
377 }
378
379 and trap_exit:
380
381 trap_exit(x_cause):
382 {
383 ISANS = LAST-ISANS
384 LAST-ISANS = TRAP_ISANS_VEC[x_cause]
385 }
386 \end{verbatim}
387
388 \subsection{Is this like MISA ?} \label{misa}
389
390 \paragraph{}
391
392 No.
393
394 \begin{itemize}
395 \parskip 0pt
396 \itemsep 1pt
397
398 \item
399
400 \gls{MISA}'s space is entirely taken up (and running out).
401
402 \item
403
404 There is no allocation (provision) for custom extensions.
405
406 \item
407
408 MISA switches on and off entire extensions: \gls{ISAMUX}/NS may be used to switch
409 multiple opcodes (present and future), to alternate meanings.
410
411 \item
412
413 MISA is WARL and is inaccessible from everything but M-Mode (not even readable).
414
415 \end{itemize}
416
417 \paragraph{}
418
419 MISA is therefore wholly unsuited to U-Mode usage; ISANS is specifically
420 permitted to be called by userspace to switch (with no stalling) between
421 namespaces, repeatedly and in quick succession.
422
423 \subsection{What happens if this scheme is not adopted? Why is it better than leaving things well alone?} \label{laissezfaire}
424
425 \paragraph{}
426
427 At the first sign of an emergency non-backwards compatible and unavoidable
428 change to the \textbf{frozen} RISCV \textbf{official} Standards, the entire RISCV
429 community is fragmented and divided into two:
430
431 \begin{itemize}
432 \parskip 0pt
433 \itemsep 1pt
434
435 \item
436
437 Those vendors that are hardware compatible with the legacy standard.
438
439 \item
440
441 Those that are compatible with the new standard.
442
443 \end{itemize}
444
445 \paragraph{}
446
447 \textbf{These two communities would be mutually exclusively incompatible}. If
448 a second emergency occurs, \gls{RISCV} becomes even less tenable.
449
450 \paragraph{}
451
452 Hardware that wished to be \textbf{compatible} with either flavour would require
453 \gls{JIT} or offline static binary recompilation. No vendor would willingly
454 accept this as a condition of the standards divergence in the first place,
455 locking up decision making to the detriment of RISCV as a whole.
456
457 \paragraph{}
458
459 By providing a \textbf{safety valve} in the form of a hidden namespace, at least
460 newer hardware has the option to implement both (or more) variations,
461 \textbf{and still apply for Certification}.
462
463 \paragraph{}
464
465 However to also allow \textbf{legacy} hardware to at least be JIT soft
466 compatible, some very strict rules \textbf{must} be adhered to, that appear at
467 first sight not to make any sense.
468
469 \paragraph{}
470
471 It's complicated in other words!
472
473 \subsection{Surely it's okay to just tell people to use 48-bit encodings?} \label{use48bit}
474
475 \paragraph{}
476
477 Short answer: it doesn't help resolve conflicts, and costs hardware and
478 redesigns to do so. Softcores in cost-sensitive embedded applications may
479 even not actually be able to fit the required 48 bit instruction decode engine
480 into a (small, ICE40) \gls{FPGA}. 48-bit instruction decoding is much more complex
481 than straight 32-bit decoding, requiring a queue.
482
483 \paragraph{}
484
485 Second answer: conflicts can still occur in the (unregulated, custom) 48-bit
486 space, which \textbf{could} be resolved by ISAMUX/ISANS as applied to the \textbf{48} bit
487 space in exactly the same way. And the 64-bit space.
488
489 \subsection{Why not leave this to individual custom vendors to solve on a case by case basis?} \label{case-by-case}
490
491 \paragraph{}
492
493 The suggestion was raised that a custom extension vendor could create
494 their own CSR that selects between conflicting namespaces that resolve
495 the meaning of the exact same opcode. This to be done by all and any
496 vendors, as they see fit, with little to no collaboration or coordination
497 towards standardisation in any form.
498
499 \paragraph{}
500
501 The problems with this approach are numerous, when presented to a
502 worldwide context that the UNIX Platform, in particular, has to face
503 (where the embedded platform does not)
504
505 \paragraph{}
506
507 First: lack of coordination, in the proliferation of arbitrary solutions,
508 has to primarily be borne by \gls{gcc}, \gls{Binutils}, \gls{LLVM} and other compilers.
509
510 \paragraph{}
511
512 Secondly: CSR space is precious. With each vendor likely needing only one
513 or two bits to express the namespace collision avoidance, if they make
514 even a token effort to use worldwide unique CSRs (an effort that would
515 benefit compiler writers), the CSR register space is quickly exhausted.
516
517 \paragraph{}
518
519 Thirdly: JIT Emulation of such an unregulated space becomes just as
520 much hell as it is for compiler writers. In addition, if two vendors
521 use conflicting CSR addresses, the only sane way to tell the emulator
522 what to do is to give the emulator a runtime command line argument.
523
524 \paragraph{}
525
526 Fourthly: with each vendor coming up with their own way of handling
527 conflicts, not only are the chances of mistakes higher, it is against the
528 very principles of collaboration and cooperation that save vendors money
529 on development and ongoing maintenance. Each custom vendor will have
530 to maintain their own separate hard fork of the toolchain and software,
531 which is well known to result in security vulnerabilities.
532
533 \paragraph{}
534
535 By coordinating and managing the allocation of namespace bits (unary
536 or binary) the above issues are solved. CSR space is no longer wasted,
537 compiler and JIT software writers have an easier time, clashes are
538 avoided, and RISCV is stabilised and has a trustable long term future.
539
540 \subsection{ Why ISAMUX / ISANS has to be WLRL and mandatory trap on illegal writes} \label{wlrlmandatorytrap}
541
542 \paragraph{}
543
544 The namespaces, set by bits in the CSR, are functionally directly
545 equivalent to c++ namespaces, even down to the use of braces.
546
547 \paragraph{}
548
549 WARL, by allowing implementors to choose the value, prevents and prohibits
550 the critical and necessary raising of an exception that would begin the
551 JIT process in the case of ongoing standards evolution.
552
553 \paragraph{}
554
555 Without this opportunity, an implementation has no reliable guaranteed way of knowing
556 when to drop into full JIT mode,
557 which is the only guaranteed way to distinguish
558 any given conflicting opcode. It is as if the c++
559 standard was given a similar optional
560 opportunity to completely ignore the
561 \textbf{using namespace} prefix!
562
563 \paragraph{}
564
565 --
566
567 \paragraph{}
568
569 Ok so I trust it's now clear why WLRL (thanks Allen) is needed.
570
571 \paragraph{}
572
573 When Dan raised the WARL concern initially a situation was masked by
574 the conflict, that if gone unnoticed would jeapordise ISAMUX/ISANS
575 entirely. Actually, two separate errors. So thank you for raising the
576 question.
577
578 \paragraph{}
579
580 The situation arises when foreign archs are to be given their own NS
581 bit. MIPS is allocated bit 8, x86 bit 9, whilst LE/BE is given bit 0,
582 RVCv2 bit 1 andso on. All of this potential rather than actual, clearly.
583
584 \paragraph{}
585
586 Imagine then that software tries to write and set not just bit 8 and
587 bit 9, it also tries to set bit 0 and 1 as well.
588
589 \paragraph{}
590
591 This \textbf{IS} on the face of it a legitimate reason to make ISAMUX/ISANS WARL.
592
593 \paragraph{}
594
595 However it masks a fundamental flaw that has to be addressed, which
596 brings us back much closer to the original design of 18 months ago,
597 and it's highlighted thus:
598
599 \paragraph{}
600
601 x86 and simultaneous RVCv2 modes are total nonsense in the first place!
602
603 \paragraph{}
604
605 The solution instead is to have a NS bit (bit0) that SPECIFICALLY
606 determines if the arch is RV or not. If 0, the rest of the ISAMUX/ISANS
607 is very specifically RV \textbf{only}, and if 1, the ISAMUX/ISANS is a \textbf{binary}
608 table of foreign architectures and foreign architectures only.
609
610 \paragraph{}
611
612 Exactly how many bits are used for the foreign arch table, is to
613 be determined. 7 bits, one of which is reserved for custom usage,
614 leaving a whopping 64 possible \textbf{official} foreign instruction sets to
615 be hardware-supported/JIT-emulated seems to be sufficiently gratuitous,
616 to me.
617
618 \paragraph{}
619
620 One of those could even be Java Bytecode!
621
622 \paragraph{}
623
624 Now, it could \textbf{hypothetically} be argued that the permutation of setting
625 LE/BE and MIPS for example is desirable. A simple analysis shows this
626 not to be the case: once in the MIPS foreign NS, it is the MIPS hardware
627 implementation that should have its own way of setting and managing its
628 LE/BE mode, because to do otherwise drastically interferes with MIPS
629 binary compatibility.
630
631 \paragraph{}
632
633 Thus, it is officially Not Our Problem: only flipping into one foreign
634 arch at a time makes sense, thus this has to be reflected in the
635 ISAMUX/ISANS CSR itself, completely side-stepping the (apparent) need
636 to make the NS CSR WARL (which would not work anyway, as previously
637 mentioned).
638
639 \paragraph{}
640
641 So, thank you, again, Dan, for raising this. It would have completely
642 jeapordised ISAMUX/NS if not spotted.
643
644 \paragraph{}
645
646 The second issue is: how does any hardware system, whether it support
647 ISANS or not, and whether any future hardware supports some Namespaces
648 and, in a transitive fashion, has to support \textbf{more} future namespaces,
649 through JIT emulation, if this is not planned properly in advance?
650
651 \paragraph{}
652
653 Let us take the simple case first: a current 2019 RISCV fully compliant
654 RV64GC UNIX capable system (with mandatory traps on all unsupported CSRs).
655
656 \paragraph{}
657
658 Fast forward 20 years, there are now 5 ISAMUX/NS unary bits, and 3
659 foreign arch binary table entries.
660
661 \paragraph{}
662
663 Such a system is perfectly possible of software JIT emulating ALL of these
664 options because the write to the (illegal, for that system) ISAMUX/NS
665 CSR generates the trap that is needed for that system ti begin JIT mode.
666
667 \paragraph{}
668
669 (This again emphasises exactly why the trap is mandatory).
670
671 \paragraph{}
672
673 Now let us take the case of a hypothetical system from say 2021 that
674 implements RVCv2 at the hardware level.
675
676 \paragraph{}
677
678 Fast forward 20 years: if the CSR were made WARL, that system would be
679 absolutely screwed. The implementor would be under the false impression
680 that ignoring setting of \textbf{illegal} bits was acceptable, making the
681 transition to JIT mode flat-out impossible to detect.
682
683 \paragraph{}
684
685 When this is considered transitively, considering all future additions to
686 the NS, and all permutations, it can be logically deduced that there is
687 a need to reserve a \textbf{full} set of bits in the ISAMUX/NS CSR \textbf{in advance}.
688
689 \paragraph{}
690
691 i.e. that \textbf{right now}, in the year 2019, the entire ISAMUX/NS CSR cannot
692 be added to piecemeal, the full 32 (or 64) bits \textbf{has} to be reserved,
693 and reserved bits set at zero.
694
695 \paragraph{}
696
697 Furthermore, if any software attempts to write to those reserved bits,
698 it \textbf{must} be treated just as if those bits were distinct and nonexistent
699 CSRs, and a trap raised.
700
701 \paragraph{}
702
703 It makes more sense to consider each NS as having its own completely
704 separate CSR, which, if it does not exist, clearly it should be obvious
705 that, as an unsupported CSR, a trap should be raised (and JIT emulation
706 activated).
707
708 \paragraph{}
709
710 However given that only the one bit is needed (in RV NS Mode, not
711 Foreign NS Mode), it would be terribly wasteful of the CSRs to do this,
712 despite it being technically correct and much easier to understand why
713 trap raising is so essential (mandatory).
714
715 \paragraph{}
716
717 This again should emphasise how to mentally get one's head round this
718 mind-bendingly complex problem space: think of each NS bit as its own
719 totally separate CSR that every implementor is free and clear to implement
720 (or leave to JIT Emulation) as they see fit.
721
722 \paragraph{}
723
724 Only then does the mandatory need to trap on write really start to hit
725 home, as does the need to preallocate a full set of reserved zero values
726 in the RV ISAMUX/NS.
727
728 \paragraph{}
729
730 Lastly, I \textbf{think} it's ok to only reserve say 32 bits, and, in 50 years
731 time if that genuinely is not enough, start the process all over again
732 with a new CSR. ISAMUX2/NS2.
733
734 \paragraph{}
735
736 Subdivision of the RV NS (support for RVCv3/4/5/RV16 without wasting
737 precious CSR bits) best left for discussion another time, the above is
738 a heck of a lot to absorb, already.
739
740 \subsection{Why WARL will not work and why WLRL is required}
741
742 \paragraph{}
743
744 WARL requires a follow-up read of the CSR to ascertain what heuristic
745 the hardware \textbf{might} have applied, and if that procedure is followed in
746 this proposal, performance even on hardware would be severely compromised.
747
748 \paragraph{}
749
750 In addition when switching to foreign architectures, the switch has to
751 be done atomically and guaranteed to occur.
752
753 \paragraph{}
754
755 In the case of JIT emulation, the WARL \textbf{detection} code will be in an
756 assembly language that is alien to hardware.
757
758 \paragraph{}
759
760 Support for both assembly languages immediately after the CSR write
761 is clearly impossible, this leaves no other option but to have the CSR
762 be WLRL (on all platforms) and for traps to be mandatory (on the UNIX
763 Platform).
764
765 \subsection{Is it strictly necessary for foreign archs to switch back?} \label{foreignswitch}
766
767 \paragraph{}
768
769 No, because LAST-ISANS handles the setting and unsetting of the ISANS CSR
770 in a completely transparent fashion as far as the foreign arch is concerned.
771 Supervisor or Hypervisor traps take care of the context switch in a way
772 that the user mode (or guest) need not be aware of, in any way.
773
774 \paragraph{}
775
776 Thus, in e.g. Hypervisor Mode, the foreign guest arch has no knowledge
777 or need to know that the hypervisor is flipping back to RV at the time of
778 a trap.
779
780 \paragraph{}
781
782 Note however that this is \textbf{not} the same as the foreign arch executing
783 \textbf{foreign} traps! Foreign architecture trap and interrupt handling mechanisms
784 are \textbf{out of scope} of this document and MUST be handled by the foreign
785 architecture implementation in a completely transparent fashion that in
786 no way interacts or interferes with this proposal.
787
788 \subsection{Can we have dynamic declaration and runtime declaration of capabilities?} \label{dynamic}
789
790 \paragraph{}
791
792 Answer: don't know (yet). Quoted from Rogier:
793
794 \begin{quote}
795 "A \gls{SoC} may have several devices that one may want to directly control
796 with custom instructions. If independent vendors use the same opcodes you
797 either have to change the encodings for every different chip (not very
798 nice for software) or you can give the device an ID which is defined in
799 some device tree or something like that and use that."
800 \end{quote}
801
802 \paragraph{}
803
804 Dynamic detection wasn't originally planned: static
805 compilation was envisaged to solve the need, with a table of
806 mvendorid-marchid-isamux/isans being maintained inside gcc / binutils /
807 llvm (or separate library?) that, like the Linux kernel ARCH table,
808 requires a world-wide atomic \textbf{git commit} to add globally-unique
809 registered entries that map functionality to actual namespaces.
810
811 \paragraph{}
812
813 where that goes wrong is if there is ever a pair (or more) of vendors
814 that use the exact same custom feature that maps to different opcodes,
815 a statically-compiled binary has no hope of executing natively on both
816 systems.
817
818 \paragraph{}
819
820 at that point: yes, something akin to device-tree would be needed.
821
822 \section{Open Questions}\label{open-questions}
823
824 \paragraph{}
825
826 This section from a post by Rogier Bruisse
827 \href{http://hands.com/~lkcl/gmail_re_isadev_isamux.html}{http://hands.com/~lkcl/gmail\_re\_isadev\_isamux.html}
828
829 \subsection{is the ISANS CSR a 32 or XLEN bit value?} \label{isans-32-or-xlen}
830
831 \paragraph{}
832
833 This is partly answered in another FAQ above: if 32 bits is not enough
834 for a full suite of official, custom-with-atomic-registration and custom-without
835 then a second CSR group (ISANS2) may be added at a future date (10-20 years
836 hence).
837
838 \paragraph{}
839
840 32 bits would not inconvenience RV32, and implementors wishing to
841 make significant altnernative modifications to opcodes in the RV32 ISA space
842 could do so without the burden of having to support a split 32/LO 32/HI
843 CSR across two locations.
844
845 \subsection{Is the ISANS a flat number space or should some bits be reserved for use as flags?}
846
847 \paragraph{}
848
849 See 16-bit RV namespace "page" concept, above. Some bits have to be unary
850 (multiple simultaneous features such as LE/BE in one bit, and augmented
851 Floating-point rounding / clipping in another), whilst others definitely
852 need to be binary (the most obvious one being \textbf{paging} in the space currently
853 occupied by RVC).
854
855 \subsection{Should the ISANS space be partitioned between reserved, custom with registration guaranteed non clashing, custom, very likely non clashing?}
856
857 \paragraph{}
858
859 Yes. Format TBD.
860
861 \subsection{Should only compiler visible/generated constant setting with CSRRWI and/or using a clearly recognisable LI/LUI be accommodated or should dynamic setting be accommodated as well?}
862
863 \paragraph{}
864
865 This is almost certainly a software design issue, not so much a hardware
866 issue.
867
868 \subsection{How should the ISANS be (re)stored in a trap and in context switch?}
869
870 \paragraph{}
871
872 See section above on privilege mode: LAST-ISANS has been introduced that
873 mirrors (x)CAUSE and (x)EPC pretty much exactly. Context switches change
874 uepc just before exit from the trap, in order to change the user-mode PC
875 to switch to a new process, and ulast-isans can - must - be treated in
876 exactly the same way. When the context switch sets ulast-isans (and uepc),
877 the hardware flips both ulast-isans into uisans and uepc into pc (atomically):
878 both the new NS and the new PC activate immediately, on return to usermode.
879
880 \paragraph{}
881
882 Quite simple.
883
884 \subsection{Should the mechanism accommodate "foreign ISA's" and if so how does one restore the ISA.}
885
886 \paragraph{}
887
888 See section above on LAST-ISANS. With the introduction of LAST-ISANS, the
889 change is entirely transparent, and handled by the Supervisor (or Hypervisor)
890 trap, in a fashion that the foreign ISA need not even know of the existence
891 of ISANS. At all.
892
893 \subsection{Where is the default ISA stored and what is responsible for what it is after}
894
895 \paragraph{}
896
897 Options:
898 \begin{itemize}
899 \parskip 0pt
900 \itemsep 1pt
901
902 \item
903
904 start up
905
906 \item
907
908 starting a program
909
910 \item
911
912 calling into a dynamically linked library
913
914 \item
915
916 taking a trap
917
918 \item
919
920 changing privilege levels
921
922 \end{itemize}
923
924 \paragraph{}
925
926 These first four are entirely at the discretion of (and the
927 responsibility of) the software. There is precedent for most of these
928 having been implemented, historically, at some point, in relation to
929 LE/BE mode CSRs in other hardware (MIPSEL vs MIPS distros for example).
930
931 \paragraph{}
932
933 Traps are responsible for saving LAST-ISANS on the stack, exactly as they
934 are also responsible for saving other context-sensitive information such
935 as the registers and xEPC.
936
937 \paragraph{}
938
939 The hardware is responsible for atomically switching out ISANS into the
940 relevant xLAST-ISANS (and back again on exit). See Privileged Traps,
941 above.
942
943 \subsection{If the ISANS is just bits of an instruction that are to be prefixed by the cpu, can those bits contain immediates? Register numbers?}
944
945 \paragraph{}
946
947 The concept of a CSR containing an immediate makes no sense. The concept
948 of a CSR containing a register number, the contents of which would, presumably,
949 be inserted into the NS, would immediately make that register a permanent
950 and irrevocably reserved register that could not be utilised for any other
951 purpose.
952
953 \paragraph{}
954
955 This is what the CSRs are supposed to be for!
956
957 \paragraph{}
958
959 It would be better just to have a second CSR - ISANS2 - potentially even ISANS3
960 in 60+ years time, rather than try to use a GPR for the purposes for which CSRs
961 are intended.
962
963 \subsection{How does the system indicate a namespace is not recognised? Does it trap or can/must a recoverable mechanism be provided?}
964
965 \paragraph{}
966
967 It doesn't "indicate" that a namespace is not recognised. WLRL fields only
968 hold supported values. If the hardware cannot hold the value, a trap
969 \textbf{MUST} be thrown (in the UNIX platform), and at that point it becomes the
970 responsibility of software to deal with it.
971
972 \subsection{What are the security implications? Can some ISA namespaces be set by user space?}
973
974 \paragraph{}
975
976 Of course they can. It becomes the responsibility of the Supervisor Mode
977 (the kernel) to treat ISANS in a fashion orthogonal to the PC. If the OS
978 is not capable of properly context-switching securely by setting the right
979 PC, it's not going to be capable of properly looking after changes to ISANS.
980
981 \subsection{Does the validity of an ISA namespace depend on privilege level? If so how?}
982
983 \paragraph{}
984
985 The question does not exactly make sense, and may need a re-reading of the
986 section on how Privilege Modes, above. In RISC-V, privilege modes do not
987 actually change very much state of the system: the absolute minimum changes
988 are made (swapped out) - xEPC, xSTATUS and so on - and the privilege mode
989 is expected to handle the context switching (or other actions) itself.
990
991 \paragraph{}
992
993 ISANS - through LAST-ISANS - is absolutely no different. The trap and the
994 kernel (Supervisor or Hypervisor) are provided the \textbf{mechanism} by which
995 ISA Namespace \textbf{may} be set: it is up to the software to use that mechanism
996 correctly, just as the software is expected to use the mechanisms provided
997 to correctly implement context-switching by saving and restoring register
998 files, the PC, and other state. The NS effectively becomes just another
999 part of that state.