Add claim support in plictool
This commit is contained in:
parent
cae948e923
commit
44a6ef47b8
31
JOURNAL.md
31
JOURNAL.md
@ -4311,3 +4311,34 @@ helpful.
|
|||||||
For that I need to first switch to the 8250/16550 driver. Let's try switch to
|
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
|
the ttyS0 without enabling flow control yet. We probably need to change the
|
||||||
stage1 and stage2 scripts to follow the proper console device.
|
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.
|
||||||
|
@ -8,9 +8,10 @@
|
|||||||
* v0.0.1 (2024-09-03): Initial version.
|
* v0.0.1 (2024-09-03): Initial version.
|
||||||
* v0.0.2 (2024-09-04): Print contexts in another line and masked information.
|
* 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.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 <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -21,10 +22,12 @@
|
|||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
enum op { DUMP, CLAIM } operation = DUMP;
|
||||||
const char *plic_address_str = "0x40800000";
|
const char *plic_address_str = "0x40800000";
|
||||||
long ncontexts = 15872L;
|
long ncontexts = 15872L;
|
||||||
long maxsources = 1024L;
|
long maxsources = 1024L;
|
||||||
long nsources = 1024L;
|
long nsources = 1024L;
|
||||||
|
long claim_ctx = 0;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
usage(void)
|
usage(void)
|
||||||
@ -34,7 +37,7 @@ usage(void)
|
|||||||
" plictool - dump PLIC information\n"
|
" plictool - dump PLIC information\n"
|
||||||
"\n"
|
"\n"
|
||||||
"SYNOPSIS\n"
|
"SYNOPSIS\n"
|
||||||
" plictool [-a addr] [-s nsources] [-c ncontexts]\n"
|
" plictool [-a addr] [-s nsources] [-c ncontexts] [-C ctx]\n"
|
||||||
"\n"
|
"\n"
|
||||||
"DESCRIPTION\n"
|
"DESCRIPTION\n"
|
||||||
" Dumps information about the RISC-V PLIC interrupt controller.\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"
|
" -c ncontexts Limit the number of contexts to print.\n"
|
||||||
" The default is 15872.\n"
|
" The default is 15872.\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
" -C ctx Claim the interrupt on the given context.\n"
|
||||||
|
"\n"
|
||||||
"OUTPUT FORMAT\n"
|
"OUTPUT FORMAT\n"
|
||||||
" Information is printed for each source that has some bit set\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"
|
" in the pending or priority registers, or it has some context\n"
|
||||||
@ -75,7 +80,31 @@ usage(void)
|
|||||||
exit(1);
|
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++) {
|
for (long s = 0; s < nsources; s++) {
|
||||||
int printed_source = 0;
|
int printed_source = 0;
|
||||||
@ -133,7 +162,7 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
int opt;
|
int opt;
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "a:hs:c:")) != -1) {
|
while ((opt = getopt(argc, argv, "a:hs:c:C:")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'a':
|
case 'a':
|
||||||
plic_address_str = optarg;
|
plic_address_str = optarg;
|
||||||
@ -144,6 +173,10 @@ int main(int argc, char *argv[])
|
|||||||
case 'c':
|
case 'c':
|
||||||
ncontexts = atol(optarg);
|
ncontexts = atol(optarg);
|
||||||
break;
|
break;
|
||||||
|
case 'C':
|
||||||
|
operation = CLAIM;
|
||||||
|
claim_ctx = atol(optarg);
|
||||||
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
default: /* '?' */
|
default: /* '?' */
|
||||||
usage();
|
usage();
|
||||||
@ -177,7 +210,10 @@ int main(int argc, char *argv[])
|
|||||||
exit(1);
|
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);
|
munmap(map_base, map_size);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user