Commit Graph

2624 Commits

Author SHA1 Message Date
Mingjie Shen
ed2a3a754d [lib][heap] Fix array index out-of-range
argv[] should have at least 3 elements because argv[2] is accessed in line 345.
2024-03-01 15:22:36 -08:00
Travis Geiselbrecht
679fbb6e96 [github][actions] update checkout and cache to v4 2024-02-27 00:53:37 -08:00
Travis Geiselbrecht
8176ae67c8 [libc][cdefs] add a few additional features in cdefs
This seems to only be needed for older gccs (found with 7.5.0).
2024-02-27 00:46:56 -08:00
Travis Geiselbrecht
406f28a3ea [platform][rp2040] Update the pico platform after updating the SDK
The build was momentarily broken until this was added to fix it.

Also generally remove a few extraneous defines in the platform code.
2024-02-27 00:35:23 -08:00
Travis Geiselbrecht
c892c958f4 [external] update raspberry pi pico SDK
Bump to version 1.5.1 from
https://github.com/raspberrypi/pico-sdk
6a7db34ff63345a7badec79ebea3aaef1712f374

All code verbatim with the exception of the removal of CmakeList.txt
files and a tweak to platform.h.
2024-02-27 00:12:23 -08:00
Travis Geiselbrecht
25ff64d4fd [libc] move sys/cdefs.h out of libm and into the main include path
More code is using it, so try to build a more standardized version of
it. For now, since most of the defines that are needed are similar to
lk/compiler.h, mostly reimplement in terms of those.
2024-02-27 00:12:15 -08: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
74192acef5 [debugcommands][crash] add a variant for cortex-m
Touching around address 0 doesn't cause a cortex-m device to crash, but
branching to an aligned address absolutely will.
2024-02-26 00:58:04 -08:00
Travis Geiselbrecht
5249549e12 [platform][rosco_m68k] update the duart driver
-Reinitialize the uart bit modes
-Ignore framing/break errors on receive. Unclear why they seem to always
be set in the fifo, but seems to be safe to ignore for now
-Make sure platform_pgetc returns the right error code
-Initialize the output ports to all gpios
2024-02-11 01:28:49 -08:00
Travis Geiselbrecht
23cff5b493 [lib][debug] remove unused function 2024-02-11 00:39:53 -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
d9b7d070c9 [top] add header declaration for lk_boot_args
Update users of the boot args array to use the header.
2024-02-11 00:38:09 -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
Matt Schulte
6b16ef0da2 [console] Fix complition error when CONSOLE_OUTPUT_TO_PLATFORM_PUTC=0
Need to move `size_t i` into the correct location. Also, set the
CONSOLE_OUTPUT_TO_PLATFORM_PUTC define in the module makefile.

Change-Id: I732ebbcc43219806d5dfd3b9bdd28bf1811248dc
2023-12-16 15:52:24 -08:00
gvk51
6a33334c1e [lib][debugcommands] option to input physical address for debug commands
dw/mw and the sister commands take virtual address as input for display
or modify. Option "-p" to the command signifies the address input is
physical, and the address translation is handled by the command.

Newly added option is available with WITH_KERNEL_VM, usage as follows

] dw 0xffffffff05100000 4
0xffffffff05100000: 0000dead
] dw 0x5100000 4 -p
0xffffffff05100000: 0000dead

Signed-off-by: VAMSHI GAJJELA <vamshigajjela@google.com>
2023-12-04 01:07:26 -08:00
crady
712d7f58dc [documentation] LK Memory Management Overview 2023-12-04 01:00:24 -08:00
Matt Schulte
1ce428d305 [console] Flag to disable default console output
Introduces a flag which allows a project to disable the default output
to platform_dputc. This is useful is the project wants to maintain
`platform_dputc` for panic conditions but otherwise use a registered
callback for console io.

Change-Id: I1362529a6bb40d191ac3f7c6069985c371d9284c
2023-12-04 00:57:16 -08:00
Matt Schulte
6414dd13b0 [make] Remove duplicate compile rules for modes
Currently, the compilation rules are mostly duplicated for normal vs
float vs ARM source files. This fix deduplicates the compilation logic
for these different "mode" of source files by using make's
Target-specific variable functionality.

https://www.gnu.org/software/make/manual/make.html#Target_002dspecific

This change was tested by using
[`bear`](https://github.com/rizsotto/Bear) to generate a
compile_commands.json file. The file was generated both before and after
the change and the json diff'd to ensure the generated compile commands
were not changed.

Change-Id: Id472045cc2e65bf542dfbf0ff52089be224c9d13
2023-12-04 00:56:39 -08:00
Matt Schulte
b0b2665cea [make] Add ability to deny modules from being used
Certain projects may want to prevent the usage of certain modules from
being used. Here are two examples of when this may occur:

1. The Project has it's own fdt library and does not want developer's
   using the version of libfdt included with LK

2. The project does not want developers using mincrypt.

`DENY_MODULES` is a list which developers can set in their own project
makefiles which is checked on each module inclusion. If that module is
on the deny list, it causes a build failure.
2023-12-04 00:53:01 -08:00
Cody Wong
94a15119b2 [libc][string] fix strncpy potential buffer overflow
The wrong placement of the increment for index `i` causes an unexpected
behavior, which the `strncpy` writes an extra '\0'.

For example:
The `src` string is "abc". The buffer size of `dest` is 5.

When we call `strncpy(dest, src, 5)`, the first `for` loop copies the
characters, 'a', 'b', and 'c', to the `dest[0:2]`. In the 4th iteration,
however, the `for` loop breaks due to the termination of `src` whereas
the value of `i` stays 3. At the moment, it has copied 4 bytes,
including the '\0' of `src`.

In the second `for` loop, we have `i = 3` and `count = 5`, so the loop
copies two more '\0' to the `dest`. As a result, the `strncpy` copies 6
bytes to the `dest` buffer, leading to buffer overflow.

Fix the issue by increasing the index `i` before every copy.

Signed-off-by: Cody Wong <codycswong@google.com>
2023-11-04 13:16:24 -07:00
Travis Geiselbrecht
ec261bcf45 [github][ci] switch to gcc 13.2.0 for the default build compiler 2023-10-15 14:45:49 -07:00
Travis Geiselbrecht
58fd2c36d5 [platform][jh7110] Tweak logic to find the FDT from the uimage 2023-10-15 14:41:30 -07:00
Travis Geiselbrecht
6b7d0ab627 [lib][fdtwalk] add code to skip a cpu if disabled
Some RISC-V cpus come up disabled, skip enumerating them.
2023-10-15 14:41:30 -07: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
Travis Geiselbrecht
30dc320054 [github] Merge pull request #380 from arichardson/add-clang-ci
Allow building RISCV64 and x86_64 with clang and add a Clang CI job
2023-06-21 15:42:35 -07:00
Matt Schulte
9325ca7f3b Fix typo in endif comment 2023-06-21 15:36:22 -07:00
Alex Richardson
3b215c398e [ci] Add 64-bit RISC-V to Clang CI 2023-06-08 07:08:49 -07:00
Alex Richardson
bf6ab93088 [riscv] Workaround for undef-weak symbol relocations with clang+lld
When building with clang -mcmodel=medany and linking with ld.lld, we get
out-of-range relocation errors for undefined __start_<section> symbols
since 0 cannot be represented as a PC-relative offset). This is not a
problem with ld.bfd since ld.bfd rewrites the instructions to avoid the
out-of-range PC-relative relocation. For now, the simplest workaround is
to build with -fpie -mcmodel=medany (thus indirecting these symbols via
the GOT). This will be done automatically once clang includes
https://reviews.llvm.org/D107280.

Without this change I get the following linker errors:
ld.lld: error: dev/driver.c:21:(.text+0x1E): relocation R_RISCV_PCREL_HI20 out of range: -524295 is not in [-524288, 524287]; references __start_devices

See https://github.com/riscv-non-isa/riscv-elf-psabi-doc/issues/126 and
https://github.com/riscv-non-isa/riscv-elf-psabi-doc/pull/201.
2023-06-08 07:08:49 -07:00
Alex Richardson
69111c40f5 [make] Add a COMPILER_TYPE variable
This can be used to change compiler flags for GCC vs Clang.
2023-06-08 07:08:49 -07:00
Alex Richardson
135479c70e [riscv] Disable linker relaxations when linking with ld.lld
We have to compile RISC-V code with -mno-relax when linking with ld.lld
since ld.lld does not yet support RISC-V linker relaxations. Without this
change, linking with ld.lld results in many errors such as:
`relocation R_RISCV_ALIGN requires unimplemented linker relaxation`.

This support was implemented as part of LLVM 15, but to support older
versions of ld.lld we add the flag unconditionally for now.
2023-06-08 07:08:49 -07:00
Alex Richardson
8c20e005ca [make] Set LINKER_TYPE to lld when building with ld.lld
This will be needed in a follow-up commit to disable linker relaxations
for RISC-V since ld.ldd does not support them yet.
2023-06-08 07:08:49 -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
6025bec3a1 [ci] Add pc-x86-64-test to the Clang CI job 2023-06-07 15:55:50 -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
4a9d0c33bd [make] Build with -ffreestanding
We should build with -ffreestanding since we are building an OS kernel and
cannot rely on all hosted environment functionality being present.
Specifically this fixes a compilation error with clang caused by the
the #include_next <limits.h>:
```
In file included from target/pc-x86/config.c:9:
In file included from dev/include/dev/driver.h:10:
In file included from lib/libc/include/sys/types.h:10:
In file included from lib/libc/include/limits.h:5:
In file included from /usr/lib/llvm-15/lib/clang/15.0.7/include/limits.h:21:
/usr/include/limits.h:26:10: fatal error: 'bits/libc-header-start.h' file not found
#include <bits/libc-header-start.h>
```
The flag fixes this issue by ensuring that __STDC_HOSTED__ is no longer set
to 1, so Clang's limits.h will not try to include the host system one.
2023-06-07 15:55:50 -07:00
Alex Richardson
acb933b5ac [ci] Add a LLVM toolchain CI configuration file
This only builds a subset of all targets for now since the remaining
ones (32-bit targets) would require libgcc/compiler-rt for the 64-bit
integer and/or double-precision float helper functions.
Currently, only aarch64 targets build with clang, but with follow-up
this can be extended to include x86_64 and RISCV64.
2023-06-07 15:55:49 -07:00
Alexander Richardson
9cc95f1bf0 Don't notify IRC on pushes to forks 2023-06-07 13:27:16 -07:00
Travis Geiselbrecht
c3a5c31aac [make][engine] make the setting of toolchain variables conditional
CC, LD, etc was already settable by the environment, but not by
local.mk, since they were assigned in engine.mk as :=. Change the set to
be conditional to fix this.
2023-06-01 17:53:22 -07:00
Alex Richardson
923541d4c2 [clang][arm64] Disable -Wasm-operand-widths warning
Clang incorrectly diagnoses msr operations as need a 64-bit operand even
if the underlying register is actually 32 bits. Silence this warning.
There are quite a few occurrences of this warning so I opted to add the
-Wno-flag instead of wrapping all callsites in
`#pragma clang diagnostic ignored -Wasm-operand-widths`.
2023-06-01 17:50:50 -07:00
Alex Richardson
231f58903b [make][clang] Do not add unsupported warning flags
Currently, clang does not support the -Wno-nonnull-compare and
-Wmaybe-uninitialized warning flags so this adds lots of unknown warning
flag output for each compile job when not using GCC.
This commit adds a makefile macro to check for supported warning flags
and only adds them if the compiler actually supports them.
2023-06-01 17:50:50 -07:00
Alex Richardson
06a206f44e [make] Fix linker invocation to be compatible with ld.lld
The LLD linker does not allow joined short arguments, so split -dT <script>
into -d -T <script>.
2023-06-01 17:50: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
Alex Richardson
365bb4e7a7 [clang][compiler.h] Expose a few more macros for Clang
Clang sets the defines for GCC 4.2.1, so we have to check __clang__ for
these macros in addition to the GCC version.
2023-06-01 17:50:50 -07:00
Alex Richardson
e40ac2a883 [clang] Avoid a nested function in heap_wrapper.c
This GCC extension is not supported by clang and in this case is not
necessary. Move the function to the top level to avoid the syntax error.
2023-06-01 17:50:50 -07:00
Akansh
28c615456c Fix CVE-2004-0230
Applied patch for CVE-2004-0230 in tcp_in.c which prevents RST Spoofing Attack (Denial of Service).
2023-06-01 12:43:56 -07:00