Add claim support in plictool

This commit is contained in:
Rodrigo Arias 2024-09-30 11:55:57 +02:00
parent cae948e923
commit 44a6ef47b8
2 changed files with 72 additions and 5 deletions

View File

@ -4311,3 +4311,34 @@ helpful.
For that I need to first switch to the 8250/16550 driver. Let's try switch to
the ttyS0 without enabling flow control yet. We probably need to change the
stage1 and stage2 scripts to follow the proper console device.
It works, but very slowly:
[ 0.000000] Kernel command line: root=/dev/ram0 loglevel=7 rw earlycon=sbi console=ttyS0,115200n8 debug2 ...
...
[ 42.069358] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[ 42.473860] of_serial 40001000.serial: error -ENXIO: IRQ index 0 not found
[ 42.559263] printk: legacy console [ttyS0] disabled
[ 42.614225] 40001000.serial: ttyS0 at MMIO 0x40001000 (irq = 0, base_baud = 3125000) is a 16550
[ 42.645519] printk: legacy console [ttyS0] enabled
[ 42.645519] printk: legacy console [ttyS0] enabled
[ 42.656865] printk: legacy bootconsole [sbi0] disabled
[ 42.656865] printk: legacy bootconsole [sbi0] disabled
[ 42.896358] 40003000.serial: ttyS1 at MMIO 0x40003000 (irq = 1, base_baud = 3125000) is a 16550
[ 42.999450] SuperH (H)SCI(F) driver initialized
...
~ # stty -a
speed 115200 baud;stty: standard input
line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc
Let's add the ability to claim a context in the plictool, as I suspect the claim
may be broken.

View File

@ -8,9 +8,10 @@
* v0.0.1 (2024-09-03): Initial version.
* v0.0.2 (2024-09-04): Print contexts in another line and masked information.
* v0.0.3 (2024-09-04): Make output format more clear and add manual.
* v0.0.4 (2024-09-30): Implement support for claiming an interrupt.
*/
#define VERSION "v0.0.3"
#define VERSION "v0.0.4"
#include <stdio.h>
#include <stdlib.h>
@ -21,10 +22,12 @@
#include <sys/mman.h>
#include <errno.h>
enum op { DUMP, CLAIM } operation = DUMP;
const char *plic_address_str = "0x40800000";
long ncontexts = 15872L;
long maxsources = 1024L;
long nsources = 1024L;
long claim_ctx = 0;
static void
usage(void)
@ -34,7 +37,7 @@ usage(void)
" plictool - dump PLIC information\n"
"\n"
"SYNOPSIS\n"
" plictool [-a addr] [-s nsources] [-c ncontexts]\n"
" plictool [-a addr] [-s nsources] [-c ncontexts] [-C ctx]\n"
"\n"
"DESCRIPTION\n"
" Dumps information about the RISC-V PLIC interrupt controller.\n"
@ -49,6 +52,8 @@ usage(void)
" -c ncontexts Limit the number of contexts to print.\n"
" The default is 15872.\n"
"\n"
" -C ctx Claim the interrupt on the given context.\n"
"\n"
"OUTPUT FORMAT\n"
" Information is printed for each source that has some bit set\n"
" in the pending or priority registers, or it has some context\n"
@ -75,7 +80,31 @@ usage(void)
exit(1);
}
void dump_sources(void *base)
static uint32_t
read_reg(void *base, size_t offset)
{
volatile uint32_t *p = base + offset;
return *p;
}
static void
write_reg(void *base, size_t offset, uint32_t value)
{
volatile uint32_t *p = base + offset;
*p = value;
}
static void
claim_interrupt(void *base, long ctx)
{
size_t offset = 0x200004L + ctx * 0x1000;
uint32_t value = read_reg(base, offset);
printf("ctx=%ld claim=%u\n", ctx, value);
write_reg(base, offset, value);
}
static void
dump_sources(void *base)
{
for (long s = 0; s < nsources; s++) {
int printed_source = 0;
@ -133,7 +162,7 @@ int main(int argc, char *argv[])
{
int opt;
while ((opt = getopt(argc, argv, "a:hs:c:")) != -1) {
while ((opt = getopt(argc, argv, "a:hs:c:C:")) != -1) {
switch (opt) {
case 'a':
plic_address_str = optarg;
@ -144,6 +173,10 @@ int main(int argc, char *argv[])
case 'c':
ncontexts = atol(optarg);
break;
case 'C':
operation = CLAIM;
claim_ctx = atol(optarg);
break;
case 'h':
default: /* '?' */
usage();
@ -177,7 +210,10 @@ int main(int argc, char *argv[])
exit(1);
}
dump_sources(map_base);
if (operation == CLAIM)
claim_interrupt(map_base, claim_ctx);
else if (operation == DUMP)
dump_sources(map_base);
munmap(map_base, map_size);