[RISCV] 发现一个可以看RISC-V CPU行为的开源项目

news/2024/7/10 21:46:09 标签: risc-v, 开源

最近在浏览某大型程序员交友 网站的时候发现一个好玩的项目,介绍如下:
A small program that handles mie, msi, mti and trap interrupts and updates some global variables on interrupts.
重点是他下面还放了一张图:
在这里插入图片描述
能看到RISCV CSR的行为太酷啦!!!

下面一起setup一下,万一以后项目能用到呢。
写这篇博客的时候,所以下面我会用一种顶层设计的方法来介绍怎么setup。


$ sudo apt install gcc g++ build-essential pip

Spike RISC-V ISA Simulator

$ git clone https://github.com/five-embeddev/riscv-isa-sim.git -b vcd_trace
$ git submodule update --init
$ sudo apt-get install device-tree-compiler
$ mkdir build
$ cd build
$ ../configure --prefix=/tmp/riscv-isa-sim/__install
$ make
$ [sudo] make install

你可以在/tmp/riscv-isa-sim/__install/bin下找到spike

/tmp/riscv-isa-sim/__install/bin$ ./spike
Spike RISC-V ISA Simulator 1.1.1-dev

usage: spike [host options] <target program> [target options]
Host Options:
  -p<n>                 Simulate <n> processors [default 1]
  -m<n>                 Provide <n> MiB of target memory [default 2048]
  -m<a:m,b:n,...>       Provide memory regions of size m and n bytes
                          at base addresses a and b (with 4 KiB alignment)
  -d                    Interactive debug mode
  -g                    Track histogram of PCs
  -l                    Generate a log of execution
  -h, --help            Print this help message
  -H                    Start halted, allowing a debugger to connect
  --log=<name>          File name for option -l
  --debug-cmd=<name>    Read commands from file (use with -d)
  --isa=<name>          RISC-V ISA string [default RV64IMAFDC]
  --priv=<m|mu|msu>     RISC-V privilege modes supported [default MSU]
  --varch=<name>        RISC-V Vector uArch string [default vlen:128,elen:64]
  --pc=<address>        Override ELF entry point
  --hartids=<a,b,...>   Explicitly specify hartids, default is 0,1,...
  --ic=<S>:<W>:<B>      Instantiate a cache model with S sets,
  --dc=<S>:<W>:<B>        W ways, and B-byte blocks (with S and
  --l2=<S>:<W>:<B>        B both powers of 2).
  --device=<P,B,A>      Attach MMIO plugin device from an --extlib library
                          P -- Name of the MMIO plugin
                          B -- Base memory address of the device
                          A -- String arguments to pass to the plugin
                          This flag can be used multiple times.
                          The extlib flag for the library must come first.
  --log-cache-miss      Generate a log of cache miss
  --extension=<name>    Specify RoCC Extension
                          This flag can be used multiple times.
  --extlib=<name>       Shared library to load
                        This flag can be used multiple times.
  --rbb-port=<port>     Listen on <port> for remote bitbang connection
  --dump-dts            Print device tree string and exit
  --disable-dtb         Don't write the device tree blob into memory
  --kernel=<path>       Load kernel flat image into memory
  --initrd=<path>       Load kernel initrd into memory
  --bootargs=<args>     Provide custom bootargs for kernel [default: console=hvc0 earlycon=sbi]
  --real-time-clint     Increment clint time at real-time rate
  --dm-progsize=<words> Progsize for the debug module [default 2]
  --dm-sba=<bits>       Debug system bus access supports up to <bits> wide accesses [default 0]
  --dm-auth             Debug module requires debugger to authenticate
  --dmi-rti=<n>         Number of Run-Test/Idle cycles required for a DMI access [default 0]
  --dm-abstract-rti=<n> Number of Run-Test/Idle cycles required for an abstract command to execute [default 0]
  --dm-no-hasel         Debug module supports hasel
  --dm-no-abstract-csr  Debug module won't support abstract to authenticate
  --dm-no-halt-groups   Debug module won't support halt groups
  --dm-no-impebreak     Debug module won't support implicit ebreak in program buffer
  --vcd-log=<file>      Log VCD to this file.
  --max-cycles=<cycle count>      Limit simulation to this number of cycles.

gtkwave

$ sudo apt install meson gperf flex desktop-file-utils libgtk-3-dev libbz2-dev libjudy-dev libgirepository1.0-dev

升级meson到 > 1.0,ubuntu自带的是0.61.2版本,不能满足项目的编译要求

$ pip install --upgrade meson

Building GTKWave

$ git clone https://github.com/gtkwave/gtkwave.git
$ cd gtkwave
$ meson setup build
$ meson compile -C build

你可以在/tmp/gtkwave/build/src/helpers/下找到fst2vcd,在/tmp/gtkwave/build/src/下找到gtkwave,将在下面的riscv-scratchpad用到。

riscv-scratchpad

$ git clone https://github.com/five-embeddev/riscv-scratchpad.git
$ cd riscv-scratchpad/baremetal-vcd-trace
$ make -j$(nproc)
# 把run_sim.sh里SPIKE=改到你刚才编译出来spike的路径,比如:SPIKE=/tmp/riscv-isa-sim/__install/bin/spike
$ source ./run_sim.sh

这里执行完的log如下

Warning: the memory at  [0x20010000, 0x2007A11F] has been realigned
to the 4 KiB page size: [0x20010000, 0x2007AFFF]
warning: tohost and fromhost symbols not in ELF; can't communicate with target
echo on
trace timestamp
Tracing timestamp, 8bytes @0x80000028
trace count_123
Tracing count_123, 1bytes @0x80000020
trace wakeup_count
Tracing wakeup_count, 8bytes @0x80000018
trace mei_count
Tracing mei_count, 4bytes @0x80000000
trace mti_count
Tracing mti_count, 4bytes @0x80000008
trace msi_count
Tracing msi_count, 4bytes @0x80000004
trace ecall_count
Tracing ecall_count, 8bytes @0x80000010
until pc 0 main
Run until pc == 0x20010100
TRACE: mei_count @ 0x80000000 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: msi_count @ 0x80000004 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: mti_count @ 0x80000008 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x0 & 0xffffffff00000000
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x0 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x0-> 0x0 & 0xff
TRACE: timestamp @ 0x80000028 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: timestamp @ 0x80000028 + 0x4= 0x0-> 0x0 & 0xffffffff00000000
pc 0
0x20010100
run 1000
TRACE: count_123 @ 0x80000020 + 0x0= 0x1-> 0x1 & 0xff
MEI = 0
MEI = 1
MEI = 0
MEI = 0
TRACE: mti_count @ 0x80000008 + 0x0= 0x1-> 0x1 & 0xffffffff
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
TRACE: timestamp @ 0x80000028 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: timestamp @ 0x80000028 + 0x4= 0x0-> 0x0 & 0xffffffff00000000
MEI = 0
MEI = 0
TRACE: timestamp @ 0x80000028 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: timestamp @ 0x80000028 + 0x4= 0x0-> 0x0 & 0xffffffff00000000
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
TRACE: count_123 @ 0x80000020 + 0x0= 0x2-> 0x2 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x1-> 0x1 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x1 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x1-> 0x1 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x1 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x2-> 0x2 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x2 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x2-> 0x2 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x2 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x3-> 0x3 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x3 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x3-> 0x3 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x3 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x4-> 0x4 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x4 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x4-> 0x4 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x4 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x5-> 0x5 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x5 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x5-> 0x5 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x5 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x6-> 0x6 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x6 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x6-> 0x6 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x6 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x7-> 0x7 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x7 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x7-> 0x7 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x7 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x8-> 0x8 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x8 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x8-> 0x8 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x8 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x9-> 0x9 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x9 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x9-> 0x9 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x9 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0xa-> 0xa & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0xa & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0xa-> 0xa & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0xa & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0xb-> 0xb & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0xb & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0xb-> 0xb & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0xb & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0xc-> 0xc & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0xc & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0xc-> 0xc & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0xc & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0xd-> 0xd & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0xd & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0xd-> 0xd & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0xd & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0xe-> 0xe & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0xe & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0xe-> 0xe & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0xe & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0xf-> 0xf & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0xf & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0xf-> 0xf & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0xf & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x10-> 0x10 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x10 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x10-> 0x10 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x10 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x11-> 0x11 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x11 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x11-> 0x11 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x11 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x12-> 0x12 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x12 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x12-> 0x12 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x12 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
pc 0
0x20010152
mem timestamp
0x00000000
mem count_123
0x00000003
mem wakeup_count
0x00000012
mem mei_count
0x00000000
mem mti_count
0x00000001
mem msi_count
0x00000000
mem ecall_count
0x00000012
interrupt 0 raise mei
MEI = 1
run 100
TRACE: mei_count @ 0x80000000 + 0x0= 0x1-> 0x1 & 0xffffffff
TRACE: mei_count @ 0x80000000 + 0x0= 0x2-> 0x2 & 0xffffffff
TRACE: mei_count @ 0x80000000 + 0x0= 0x3-> 0x3 & 0xffffffff
TRACE: mei_count @ 0x80000000 + 0x0= 0x4-> 0x4 & 0xffffffff
TRACE: mei_count @ 0x80000000 + 0x0= 0x5-> 0x5 & 0xffffffff
TRACE: mei_count @ 0x80000000 + 0x0= 0x6-> 0x6 & 0xffffffff
TRACE: mei_count @ 0x80000000 + 0x0= 0x7-> 0x7 & 0xffffffff
TRACE: mei_count @ 0x80000000 + 0x0= 0x8-> 0x8 & 0xffffffff
interrupt 0 clear mei
MEI = 0
pc 0
0x20010270
mem timestamp
0x00000000
mem count_123
0x00000003
mem wakeup_count
0x00000012
mem mei_count
0x00000008
mem mti_count
0x00000001
mem msi_count
0x00000000
mem ecall_count
0x00000012
run 1000
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x13-> 0x13 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x13 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x13-> 0x13 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x13 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x14-> 0x14 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x14 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x14-> 0x14 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x14 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x15-> 0x15 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x15 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x15-> 0x15 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x15 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x16-> 0x16 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x16 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x16-> 0x16 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x16 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x17-> 0x17 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x17 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x17-> 0x17 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x17 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x18-> 0x18 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x18 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x18-> 0x18 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x18 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x19-> 0x19 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x19 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x19-> 0x19 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x19 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x1a-> 0x1a & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x1a & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x1a-> 0x1a & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x1a & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x1b-> 0x1b & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x1b & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x1b-> 0x1b & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x1b & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x1c-> 0x1c & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x1c & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x1c-> 0x1c & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x1c & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x1d-> 0x1d & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x1d & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x1d-> 0x1d & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x1d & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x1e-> 0x1e & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x1e & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x1e-> 0x1e & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x1e & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x1f-> 0x1f & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x1f & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x1f-> 0x1f & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x1f & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x20-> 0x20 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x20 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x20-> 0x20 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x20 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x21-> 0x21 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x21 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x21-> 0x21 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x21 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x22-> 0x22 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x22 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x22-> 0x22 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x22 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x23-> 0x23 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x23 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x23-> 0x23 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x23 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x24-> 0x24 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x24 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x24-> 0x24 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x24 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x25-> 0x25 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x25 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x25-> 0x25 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x25 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x26-> 0x26 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x26 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x26-> 0x26 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x26 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x27-> 0x27 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x27 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x27-> 0x27 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x27 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x28-> 0x28 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x28 & 0xffffffff00000000
mem timestamp
0x00000000
mem count_123
0x00000003
mem wakeup_count
0x00000028
mem mei_count
0x00000008
mem mti_count
0x00000001
mem msi_count
0x00000000
mem ecall_count
0x00000027
run 5000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x28-> 0x28 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x28 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x29-> 0x29 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x29 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x29-> 0x29 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x29 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x2a-> 0x2a & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x2a & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x2a-> 0x2a & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x2a & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x2b-> 0x2b & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x2b & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x2b-> 0x2b & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x2b & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x2c-> 0x2c & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x2c & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x2c-> 0x2c & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x2c & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x2d-> 0x2d & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x2d & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x2d-> 0x2d & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x2d & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x2e-> 0x2e & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x2e & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x2e-> 0x2e & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x2e & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x2f-> 0x2f & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x2f & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x2f-> 0x2f & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x2f & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x30-> 0x30 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x30 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x30-> 0x30 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x30 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x31-> 0x31 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x31 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x31-> 0x31 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x31 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x32-> 0x32 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x32 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x32-> 0x32 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x32 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x33-> 0x33 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x33 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x33-> 0x33 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x33 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x34-> 0x34 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x34 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x34-> 0x34 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x34 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x35-> 0x35 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x35 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x35-> 0x35 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x35 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x36-> 0x36 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x36 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x36-> 0x36 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x36 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x37-> 0x37 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x37 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x37-> 0x37 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x37 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x38-> 0x38 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x38 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x38-> 0x38 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x38 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x39-> 0x39 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x39 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x39-> 0x39 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x39 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x3a-> 0x3a & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x3a & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x3a-> 0x3a & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x3a & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x3b-> 0x3b & 0xffffffff
TR

http://www.niftyadmin.cn/n/5241701.html

相关文章

代码随想录算法训练营第四十二天 _ 动态规划_01背包问题、416.分割等和子集。

学习目标&#xff1a; 动态规划五部曲&#xff1a; ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录&#xff01; 60天训练营打卡计划&#xff01; 学习内容&#xff1a; 二维数组处理01背包问题 听起来…

git入门教程+常用命令

Git入门教程 本文章主要参照视频教程&#xff1a;https://www.bilibili.com/video/BV1FE411P7B3/?spm_id_from333.337.search-card.all.click&vd_source06caf161b187fb3f4c039bc15e238fea 为什么要使用GIT 版本控制是项目、文档迭代的必然要求&#xff0c;所以需要使用…

centos定时自动备份mysql

Centos定时自动备份mysql 文章目录 Centos定时自动备份mysql1.先安装相关工具2.创建dump.sh命令文件3.编写命令文件规则4.文件夹路径5.添加crontab任务6.编写cron规则 1.先安装相关工具 共两个&#xff0c;一个是cronie 一个是 mysql-client&#xff08;一般装完mysql就自带的有…

Linux简单部署Yearning并结合内网穿透工具发布至公网可访问

目录 前言 1. Linux 部署Yearning 2. 本地访问Yearning 3. Linux 安装cpolar 4. 配置Yearning公网访问地址 5. 公网远程访问Yearning管理界面 6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具&#xff0c;为DBA与开发…

【 Go语言使用xorm框架操作数据库】

Go语言使用xorm框架操作数据库 Xorm 是一个简单而强大的Go语言ORM&#xff08;对象关系映射&#xff09;库。它支持自动将结构体映射到数据库表&#xff0c;并提供了一系列便捷的API来执行CRUD&#xff08;创建、读取、更新和删除&#xff09;操作。 安装 Xorm 首先&#xf…

前后端数据传输格式(上)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 作为后端&#xff0c;写…

用php和mysql制作一个网站

当使用PHP和MySQL制作网站时&#xff0c;我们可以利用PHP的强大功能来与MySQL数据库进行交互&#xff0c;从而实现动态网页的创建和数据存取。下面是一个关于如何使用PHP和MySQL制作网站的简单说明&#xff0c;以及一些示例代码。 ​ 1、R5Ai智能助手 chatgpt国内版本 :R5Ai智…

Python edge-tts库全部声音模型一览表

下面是edge-tts的声音模型&#xff0c;zh-CN为中文语音模型 Name: af-ZA-AdriNeural Gender: Female Name: af-ZA-WillemNeural Gender: Male Name: am-ET-AmehaNeural Gender: Male Name: am-ET-MekdesNeural Gender: Female Name: ar-AE-FatimaNeural Gender: Female N…