Commit Graph

615 Commits

Author SHA1 Message Date
Travis Geiselbrecht
69b8bccd76 [riscv] switch stimecmp/stimecmph registers to using the raw integer format
Though using the named nmemonics is a generally better idea it has the
unforunate property of not working on older compilers. In this case,
these new registers are for the Sstic extension, which is new enough
that even reasonably recent compilers as GCC 12.1 doesn't understand it.

Fixes issue #410
2024-06-16 22:37:10 -07:00
Travis Geiselbrecht
14bd7728a6 [arch][riscv][feature] add a few more feature bits
These may be useful in the future.
2024-06-02 15:31:30 -07:00
Travis Geiselbrecht
c4effaeef0 [arch][riscv] add SSTC extension support
Pretty simple extension, just directly set the supervisor timer compare
register (new) instead of calling through to SBI to set it for you.
2024-06-02 15:29:53 -07:00
Travis Geiselbrecht
b9c3603c59 [arch][riscv] fix typo matching against the zifencei feature 2024-06-02 14:51:53 -07:00
Travis Geiselbrecht
566b25d1ec [arch][riscv] read the riscv feature string out of device tree
Also added initial implementation of a way to query run time features of
the cpu.
2024-06-01 17:21:01 -07:00
Travis Geiselbrecht
479f7fb9b7 Revert "[arch][arm64][mmio] add 'Z' to the mmio write accessor inline asm"
Sadly this doesn't really work in all situations and only happens to
work with gcc + binutils for 32bit accesses, presumably because gnu as
replaces a literal 0 with wzr.

Clang doesn't understand it at all.

This reverts commit 6c14941dec.
2024-06-01 14:59:53 -07:00
Travis Geiselbrecht
6c14941dec [arch][arm64][mmio] add 'Z' to the mmio write accessor inline asm
This allows the compiler to use the xzr register if writing a zero
value, instead of uselessly moving 0 into a register first.
2024-05-24 22:33:32 -07:00
Mike McTernan
e870c0b097 trusty: arm32: fix potential double fault when printing diagnostics
When dumping_mode_regs() on a fault, avoid printing the stack beyond the
current page.  This prevents exceeding the stack base and hitting a
guard page in the case the stack use is < 128 bytes.

Bug: 336957655
Test: crash test, observe double fault fixed
Change-Id: If49b5fe5e1651557d19bf18c4026224cfb038101
2024-05-23 20:47:00 -07:00
Travis Geiselbrecht
035739433e [arch][arm] avoid using -mgeneral-regs-only for arm32
For older compilers (gcc 7.5.0 in particular) avoid using
-mgeneral-regs-only to override the floating point switches, since it
doesn't seem to understand that switch.

Instead more properly add the floating point switches for a module or
source file compiled with float. More compatible with all compilers.
2024-05-14 01:28:51 -07:00
Travis Geiselbrecht
1a761abb83 [arch][arm] Add support for float/nofloat compile options
Was already added to arm64, but arch/arm hadn't picked up this feature
yet. Uncovered a few places here or there that wasn't marking code as
float/no-float, but this fixes a problem where newer compilers are
starting to sneak in vector code because they can.

Issue #406
2024-05-14 00:57:19 -07:00
Travis Geiselbrecht
86267ca23c [include][reg.h] define new mmio_read/write accessors
To work properly with some hypervisors on various architectures (ARM,
ARM64, x86), add global routines to allow access to MMIO registers via
architecturally defined accessors.

Add accessors for ARM, ARM64, and x86-32/64. Have the other arches
default to just using whatever the compiler emits.

Will need to generally move things off the legacy REG*() accessors
since they're really not safe going forward with what compilers emit.
2024-05-13 00:39:29 -07:00
Travis Geiselbrecht
356e9adc01 [make] remove an undefine, unsupported on older gnu makes
It wasn't really that important anyway, was just a general nicety in the
riscv rules.mk
2024-05-10 16:15:54 -07:00
Travis Geiselbrecht
60bee01621 [arch][x86] stub out the cache routines 2024-05-09 19:54:54 -07:00
Travis Geiselbrecht
339ff8995a [arch][barriers] add default memory barriers for all of the architectures
Most are pretty straightforward, but a few of the more esoteric
architectures just defaults are implemented.
2024-05-09 19:51:32 -07:00
Travis Geiselbrecht
d3cd5be13e [arch][ops] define some global ARCH macros to be a bit more scoped
Instead of ICACHE/DCACHE/UCACHE, add the ARCH_CACHE_FLAG_ prefix to be a
little cleaner and not collide with anything else.

No functional change.
2024-05-09 19:28:56 -07:00
Travis Geiselbrecht
284bf108bc [arch][riscv] add new extensions for SBI 2.0
No actual features enabled, just detection.
2024-04-23 23:27:02 -07:00
Travis Geiselbrecht
6ed6f36fa0 [warnings] remove some redundant declarations
Discovered with -Wredundant-decls
2024-04-19 00:07:49 -07:00
Travis Geiselbrecht
03eb343e52 [arch][riscv] add a way for platforms to set optional riscv ISA extensions
A pretty simple mechanism, a list of extensions added to
RISCV_EXTENSION_LIST make variable is expanded to an underscore
delimited string appended to the end of -march=

Pretty simple but it should work for now.
2024-04-07 23:10:31 -07:00
Travis Geiselbrecht
00b06a8302 [arch][riscv] change secondary cpu bootstrap api
Instead of setting a counter of the number of secondaries to start, have
platform or target code pass in a list of harts to start instead. This
allows for there to be discontinuties in the layout of the cpu harts, or
in the case of some sifive based hardware, hart 0 is otherwise offline.
2024-04-07 22:32:49 -07:00
Travis Geiselbrecht
a070819c46 [clang] fix another warning that clang doesn't like 2024-04-01 23:48:50 -07:00
Travis Geiselbrecht
14f430d5e8 [arch][x86][clang] fix clang error introduced with exception cleanup
Remove extra declaration of assembly label which clang does not like.
2024-04-01 23:19:35 -07:00
Travis Geiselbrecht
ab0e1fd3a1 [arch][x86][exceptions] clean up the exception handlers
For both 32 and 64bit x86, have each of the exception stubs which push a
few words and branch to the common isr routine be simply 16 byte aligned
to make it easy to calculate the offset from the main isr table. This
cleans up some complexity that was actually broken for interrupts >= 0x80.

Also:
-Switch alignment directives to .balign
-Expand the x86-32 exception table to a full 256
-Remove an extraneous define
-Make sure the IDT is 8 or 16 byte aligned
-Use END_DATA and END_FUNCTION in the exception and gdt asm files
2024-03-10 21:50:01 -07:00
Travis Geiselbrecht
770d475224 [arch][arm-m] add additional comments and asserts to exception/context switch code 2024-02-26 00:58:04 -08:00
Travis Geiselbrecht
be19e2a960 [arch][arm-m] add clrex to context switch 2024-02-26 00:58:04 -08:00
Frank Dischner
5e69cd930d [arch][arm-m] simplify context switch
The context switch is now always performed inside the PendSV handler,
which greatly simplifies the code by reducing all switches to a single
path. This should also eliminate any race conditions during the switch.

Because we always enter PendSV for a switch, there is a slight
performance penalty in the case of switching from a non-preempted thread
to another non-preempted thread (~40 cycles longer on an M4, compared to
the previous implementation)
2024-02-26 00:58:04 -08:00
Travis Geiselbrecht
b8cff0e203 [arch][arm-m] remove the was_preempted field from the debugger structure
It will be removed in a upcoming CL, so remove it now so the future CL
cleanly applies.

Bump the major number of the structure in case there's a tool somewhere
that uses it.
2024-02-26 00:58:04 -08:00
Travis Geiselbrecht
71a413dab4 [arch][arm-m] move the debugger structure out of kernel/thread
The arm-m specific debugger structure really should live in arm-m code,
so move it there to clean things up a bit.
2024-02-26 00:58:04 -08:00
Travis Geiselbrecht
7e11c3bf78 [arch][m68k] save up to 4 arguments passed to LK
Pass the first 4 words on the stack that may have been passed from
firmware or bootloader to LK on to lk_main.
2024-02-11 00:38:52 -08:00
Travis Geiselbrecht
f7121c7b7e [arch][riscv] general riscv spinlock cleanup
-Hard set the spinlock type to uint32_t to be clearer
-Switch the free/held value to a simple 0 or 1

Previously, was writing the current cpu number into the spinlock, which
was only useful for debugging purposes. However, since the atomic
operation was an amoswap instead of a proper CAS, it would end up
overwriting the old cpu number with the new cpu number when it tried to
take it. It would still work as a spinlock, since the value was !0, but
it was falsely tracking which cpu actually held it.

To keep it simple, just switch to 0/1 and stick with the amoswap
instruction, which is much more efficient than a LR/SC pair to implement
CAS on riscv.

Internally still use an unsigned long for the old value, since the
amoswap instruction overwrites the entire Rd register, and thus keeps
the codegen efficient since it wont try to sign extend it for any
comparisons afterwards.

Thanks @loqoman (darwin.s.clark@gmail.com) for catching this one.
2023-12-28 17:02:07 -08:00
Michael Shavit
284f83af11 [arch][arm64] Fix mmu_unmap issue when FEAT_TTL is implemented
Precisely set bits [55:22] of the vaddress in bits [43:0] for the vae1is
and vaee1is TLBI commands.

On platforms where FEAT_TLL is implemented, bits [47:44] of the command
accept a TTL parameter which can optionally be set to hint the
translation table level containing the address being invalidated.
Implementations aren't architecturally required to perform the
invalidation if the hint is incorrect however. Invalidations may
therefore fail with the current implementation if the vaddress has bits
set in [58:55].

This is notably an issue on ARM fastmodels which doesn't perform the
invalidation when the TTL parameter is incorrect.
2023-09-25 16:03:45 -07:00
Alex Richardson
496e2f4b8c [riscv][clang] Use a CSR name instead of a numeric expression
Clang's assembler rejects expressions containing e.g. (1u << N) in the
assembler. Instead using numeric expressions for per-privilege level
CSRs, we can prepend `m` or `s`. This also lets the compiler assign the
CSR encoding instead of having to hardcode it in the source code.
2023-06-08 07:08:49 -07:00
Alex Richardson
e3a463e585 [x86][clang] Allow clang to evaluate isr_stub_len
The current code results in
`error: invalid reassignment of non-absolute variable 'isr_stub_start'`.
Use a numbered label instead (as that can be reassigned) and reference
the last occurrence using the b suffix.
2023-06-07 15:55:50 -07:00
Alex Richardson
c2a31bf8a6 [x86][clang] Make return mnemonic compatible with clang
GCC appears to accept the Intel retf syntax in AT&T mode but clang is
stricter and requires use of lret.
2023-06-07 15:55:50 -07:00
Alex Richardson
82e565e232 [arm64] Allow assembling with clang
Clang does not accept this .if condition since phys_offset is a register
alias and not an absolute expression. We can keep these two instructions
here if the argument is zero since the result will be the same.
Additionally, this macro is only called once and always passes a non-zero
argument. If more calls are added in the future and avoiding these two
instructions just before a loop is really important, we could use
`.ifnc \phys_offset,0` instead, but that looks rather obscure to me.
2023-06-01 17:50:50 -07:00
Aaron Odell
08111d4a37 [arch][arm-m][systick] Update for monotonicity
Update arm-m systick current_time() and current_time_hires() to advance
monotonically even when interrupts are disabled.

Previous implementation relied on the systick exception triggering
immediately when the counter wrapped and incrementing the current_ticks
count. But if called when interrutps are disabled, then the systick has
not had a chance to trigger and increment the count, but the counter has
already wrapped around. This would result in the current_time() value
moving backwards.

The implementation in this commit is as follows:
- Access to the systick val csr is always done in conjunction with a
  check of the COUNTFLAG bit, which indicates counter reaching zero.
- The global current_ticks count is incremented immediately when
  wrap around is detected via COUNTFLAG, rather than waiting for the
  systick exception to run.
- The check of the counter value, COUNTFLAG bit, and current_ticks
  global count are always done in a critical section to avoid race
  conditions between current_time and the systick handler.
- The critical section and workarounds are consolidated into a helper
  function shared by current_time() and current_time_hires() to
  atomically get the tick count and the cycles since the last tick.

The effect should be that current_time() always returns an accurate
monotonically increasing value, regardless of interrupt enablement
or not.
2023-06-01 12:40:55 -07:00
Travis Geiselbrecht
957b9033fb [scripts][python] Move a few more scripts from python2 to python3
Turns out they were already python3 safe, so just switch to requested
version over.
2023-06-01 12:17:37 -07:00
Pedro Falcato
67a5104d23 [arch][x86] Change the cache line size to 64 bytes
All remotely modern x86 CPUs use 64-byte cache lines. Change CACHE_LINE
to reflect this.
2023-05-20 17:46:24 -07:00
Aaron Odell
431e409c78 [arch][arm-m] Add Cortex M55 support
Add the Cortex M55 as a supported target.
2023-04-23 17:37:18 -07:00
Alex Richardson
6bbdcd5a09 [arm64][clang] Silence a register size mismatch warning
Even though we only need 32 bits here, clang warns that we should be
using a "w" register in the inline assembly (which is not legal with
mrs/msr). Silence the warning by declaring the value as unsigned long.

(cherry picked from commit a0de5d88dfc67b3ba34c0455b1619e12e6cfccae)
2023-04-23 17:23:31 -07:00
Travis Geiselbrecht
c66ad44efa WIP [target][visionfive2] Add initial support for a VisionFive 2 RISC-V board
Still TODO:
-Set the timer rate properly
-Fix nonzero based hart secondary cpu boot
-Try to parse the device tree for some information
2023-03-06 01:06:27 -08:00
Travis Geiselbrecht
81d6014493 [arch][riscv] Add more defines and optimize fpu context switch
Add a few more #defines for the status register
Tweak the FPU context switch to not rewrite the entire status register,
      which may not be a generally safe thing to do.
2023-02-18 16:39:45 -08:00
Travis Geiselbrecht
3dd8a32e92 [arch][riscv] a few small tweaks
Updated comment regarding clobbers on the SBI call.
Tweak a boot time print of SBI version.
Add a commented out line to the do-qemuriscv to assist in dumping future
device trees.
2023-02-18 14:42:59 -08:00
Travis Geiselbrecht
bcfad25587 [arch][x86][mmu] update how mmu code accesses physical pages
Move the mmu_initial_mapping from platform into arch/x86. For this
architecture the default mappings are basically hard coded in arch/x86
anyway, so move ownership of this data there, closer to where it's
actually initialized.
Update the 32 and 64bit paging code to properly use the paddr_to_kvaddr
and vice versa routines.
Update to allocate page tables directly from the pmm instead of the heap
(on 32bit code).
2022-11-02 23:48:49 -07:00
Travis Geiselbrecht
7742bd021b [arch][x86] general cleanup
Clean up the x86.h file a bit with how constants are defined
Switch rdtsc to builtin
Added all of the known bits for the main CR registers.
Move the invlpg macro over to the common header.
Update comments in start.S
2022-11-02 23:02:24 -07:00
Travis Geiselbrecht
7ddde308a3 [arch][x86][mmu] fix unmap routines to actually work
also additionally invlpg the address.
2022-11-02 02:09:46 -07:00
Travis Geiselbrecht
2367686854 [make] add a way for a module to opt into additional warnings
Move -Wmissing-declarations and -Wmissing-prototypes into this bucket.
Opt in most of the core top level modules in the system. More to follow.
2022-10-23 23:16:48 -07:00
Travis Geiselbrecht
7017a8fff9 [arch][mmu] add another routine to query if the arch supports user aspaces
Trim the arch mmu unit tests accordingly.

Should probably switch this to a #define, but it's possible some of
these queries could be dynamically detected (XN for example). May
revisit at some point.
2022-10-23 22:40:00 -07:00
Travis Geiselbrecht
5377fcbd12 [kernel][vm] add error handling with failed arch mmu mappings
In the 3 places in the upper VMM where it calls arch_mmu_map, try to
gracefully handle errors by unwinding the region creation.
2022-10-23 21:02:22 -07:00
Travis Geiselbrecht
2e81bfd55f [arch][x86] remove an extra printf left in the x86 mmu code 2022-10-23 21:00:15 -07:00
Travis Geiselbrecht
08b3238952 [arch][x86] clean up of mmu code
-Large cleanup of both the 32 and 64bit mmu code. Still the same general
flow but tighten up usage of mixing physical addresses with virtual
addresses.
-Remove the PAE code path from 32bit mmu, which was unused.
2022-10-23 20:37:33 -07:00