• ricfv debug


     dts

    [root@centos7 images]# qemu-system-riscv64 -machine virt -machine dumpdtb=riscv64-virt.dtb  -bios fw_jump.elf
    [root@centos7 images]# dtc -I dtb -O dts -o riscv64-virt.dts riscv64-virt.dtb
    -bash: dtc: command not found
    [root@centos7 images]#  yum install dtc
    # To convert dts file into dtb 
    <kernel-source>/scripts/dtc/dtc -I dts -O dtb <dts_file> -o <dtb_file>
    
    # To convert dtb to dts
    <kernel-source>/scripts/dtc/dtc -I dtb -O dts <dtb_file> -o <dts_file>
    
    # Both of above commands are using dtc built with linux kernel source. 
    # However you can also use dtc binary comes with ubuntu packages. For this you
    # need to install following package:
    
    sudo apt-get install -y device-tree-compiler
    
    # Ubuntu device-tree-compiler package comes with another utility known as fdtdump. 
    # fdtdump can also be used to convert dtb file into dts.
    
    fdtdump <dtb_file> > <dts_dump>
    fdtdump  riscv64-virt.dtb
    
    **** fdtdump is a low-level debugging tool, not meant for general use.
    **** If you want to decompile a dtb, you probably want
    ****     dtc -I dtb -O dts <filename>
    
    /dts-v1/;
    // magic:               0xd00dfeed
    // totalsize:           0xd1a (3354)
    // off_dt_struct:       0x38
    // off_dt_strings:      0xbc4
    // off_mem_rsvmap:      0x28
    // version:             17
    // last_comp_version:   2
    // boot_cpuid_phys:     0x0
    // size_dt_strings:     0x156
    // size_dt_struct:      0xb8c
    
    / {
        #address-cells = <0x00000002>;
        #size-cells = <0x00000002>;
        compatible = "riscv-virtio";
        model = "riscv-virtio,qemu";
        flash@20000000 {
            bank-width = <0x00000004>;
            reg = <0x00000000 0x20000000 0x00000000 0x02000000 0x00000000 0x22000000 0x00000000 0x02000000>;
            compatible = "cfi-flash";
        };
        chosen {
            bootargs = [00];
            stdout-path = "/uart@10000000";
        };
        uart@10000000 {
            interrupts = <0x0000000a>;
            interrupt-parent = <0x00000003>;
            clock-frequency = <0x00384000>;
            reg = <0x00000000 0x10000000 0x00000000 0x00000100>;
            compatible = "ns16550a";
        };
        test@100000 {
            reg = <0x00000000 0x00100000 0x00000000 0x00001000>;
            compatible = "sifive,test1", "sifive,test0";
        };
    [root@centos7 images]# cat  riscv64-virt.dts
    /dts-v1/;
    
    / {
            #address-cells = <0x2>;
            #size-cells = <0x2>;
            compatible = "riscv-virtio";
            model = "riscv-virtio,qemu";
    
            flash@20000000 {
                    bank-width = <0x4>;
                    reg = <0x0 0x20000000 0x0 0x2000000 0x0 0x22000000 0x0 0x2000000>;
                    compatible = "cfi-flash";
            };
    
            chosen {
                    bootargs = [00];
                    stdout-path = "/uart@10000000";
            };
    
            uart@10000000 {
                    interrupts = <0xa>;
                    interrupt-parent = <0x3>;
                    clock-frequency = <0x384000>;
                    reg = <0x0 0x10000000 0x0 0x100>;
                    compatible = "ns16550a";
            };
    
            test@100000 {
                    reg = <0x0 0x100000 0x0 0x1000>;
                    compatible = "sifive,test1", "sifive,test0";
            };
    
            virtio_mmio@10008000 {
                    interrupts = <0x8>;
                    interrupt-parent = <0x3>;
                    reg = <0x0 0x10008000 0x0 0x1000>;
                    compatible = "virtio,mmio";
            };
    
            virtio_mmio@10007000 {
                    interrupts = <0x7>;
                    interrupt-parent = <0x3>;
                    reg = <0x0 0x10007000 0x0 0x1000>;
                    compatible = "virtio,mmio";
            };
    
            virtio_mmio@10006000 {
                    interrupts = <0x6>;
                    interrupt-parent = <0x3>;
                    reg = <0x0 0x10006000 0x0 0x1000>;
                    compatible = "virtio,mmio";
            };
    
            virtio_mmio@10005000 {
                    interrupts = <0x5>;
                    interrupt-parent = <0x3>;
                    reg = <0x0 0x10005000 0x0 0x1000>;
                    compatible = "virtio,mmio";
            };
    
            virtio_mmio@10004000 {
                    interrupts = <0x4>;
                    interrupt-parent = <0x3>;
                    reg = <0x0 0x10004000 0x0 0x1000>;
                    compatible = "virtio,mmio";
            };
    
            virtio_mmio@10003000 {
                    interrupts = <0x3>;
                    interrupt-parent = <0x3>;
                    reg = <0x0 0x10003000 0x0 0x1000>;
                    compatible = "virtio,mmio";
            };
    
            virtio_mmio@10002000 {
                    interrupts = <0x2>;
                    interrupt-parent = <0x3>;
                    reg = <0x0 0x10002000 0x0 0x1000>;
                    compatible = "virtio,mmio";
            };
    
            virtio_mmio@10001000 {
                    interrupts = <0x1>;
                    interrupt-parent = <0x3>;
                    reg = <0x0 0x10001000 0x0 0x1000>;
                    compatible = "virtio,mmio";
            };
    
            cpus {
                    #address-cells = <0x1>;
                    #size-cells = <0x0>;
                    timebase-frequency = <0x989680>;
    
                    cpu-map {
    
                            cluster0 {
    
                                    core0 {
                                            cpu = <0x1>;
                                    };
                            };
                    };
    
                    cpu@0 {
                            phandle = <0x1>;
                            device_type = "cpu";
                            reg = <0x0>;
                            status = "okay";
                            compatible = "riscv";
                            riscv,isa = "rv64imafdcsu";
                            mmu-type = "riscv,sv48";
    
                            interrupt-controller {
                                    #interrupt-cells = <0x1>;
                                    interrupt-controller;
                                    compatible = "riscv,cpu-intc";
                                    phandle = <0x2>;
                            };
                    };
            };
    
            memory@80000000 {
                    device_type = "memory";
                    reg = <0x0 0x80000000 0x0 0x8000000>;
            };
    
            soc {
                    #address-cells = <0x2>;
                    #size-cells = <0x2>;
                    compatible = "simple-bus";
                    ranges;
    
                    pci@30000000 {
                            interrupt-map-mask = <0x1800 0x0 0x0 0x7>;
                            interrupt-map = <0x0 0x0 0x0 0x1 0x3 0x20 0x0 0x0 0x0 0x2 0x3 0x21 0x0 0x0 0x0 0x3 0x3 0x22 0x0 0x0 0x0 0x4 0x3 0x23 0x800 0x0 0x0 0x1 0x3 0x21 0x800 0x0 0x0 0x2 0x3 0x22 0x800 0x0 0x0 0x3 0x3 0x23 0x800 0x0 0x0 0x4 0x3 0x20 0x1000 0x0 0x0 0x1 0x3 0x22 0x1000 0x0 0x0 0x2 0x3 0x23 0x1000 0x0 0x0 0x3 0x3 0x20 0x1000 0x0 0x0 0x4 0x3 0x21 0x1800 0x0 0x0 0x1 0x3 0x23 0x1800 0x0 0x0 0x2 0x3 0x20 0x1800 0x0 0x0 0x3 0x3 0x21 0x1800 0x0 0x0 0x4 0x3 0x22>;
                            ranges = <0x1000000 0x0 0x0 0x0 0x3000000 0x0 0x10000 0x2000000 0x0 0x40000000 0x0 0x40000000 0x0 0x40000000>;
                            reg = <0x0 0x30000000 0x0 0x10000000>;
                            dma-coherent;
                            bus-range = <0x0 0xff>;
                            linux,pci-domain = <0x0>;
                            device_type = "pci";
                            compatible = "pci-host-ecam-generic";
                            #size-cells = <0x2>;
                            #interrupt-cells = <0x1>;
                            #address-cells = <0x3>;
                    };
    
                    interrupt-controller@c000000 {
                            phandle = <0x3>;
                            riscv,ndev = <0x35>;
                            reg = <0x0 0xc000000 0x0 0x4000000>;
                            interrupts-extended = <0x2 0xb 0x2 0x9>;
                            interrupt-controller;
                            compatible = "riscv,plic0";
                            #interrupt-cells = <0x1>;
                            #address-cells = <0x0>;
                    };
    
                    clint@2000000 {
                            interrupts-extended = <0x2 0x3 0x2 0x7>;
                            reg = <0x0 0x2000000 0x0 0x10000>;
                            compatible = "riscv,clint0";
                    };
            };
    };

    dtb信息转化为device_node结构

    http://sourcelink.top/2019/09/10/dts-unflatten_device_tree/

    [root@centos7 linux-5.14.g]# 
    [root@centos7 linux-5.14.g]# riscv64-unknown-elf-gdb  vmlinux
    GNU gdb (GDB) 11.1
    Copyright (C) 2021 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    Type "show copying" and "show warranty" for details.
    This GDB was configured as "--host=aarch64-unknown-linux-gnu --target=riscv64-unknown-elf".
    Type "show configuration" for configuration details.
    For bug reporting instructions, please see:
    <https://www.gnu.org/software/gdb/bugs/>.
    Find the GDB manual and other documentation resources online at:
        <http://www.gnu.org/software/gdb/documentation/>.
    
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from vmlinux...
    (gdb) target remote:1234
    Remote debugging using :1234
    warning: Can not parse XML target description; XML support was disabled at compile time
    0x0000000000001000 in ?? ()
    (gdb) b unflatten_dt_node
    Function "unflatten_dt_node" not defined.
    Make breakpoint pending on future shared library load? (y or [n]) y
    Breakpoint 1 (unflatten_dt_node) pending.
    (gdb) b  unflatten_device_tree
    Breakpoint 2 at 0xffffffff80c2cb42: unflatten_device_tree. (2 locations)
    (gdb) c
    Continuing.
    
    Breakpoint 2, unflatten_device_tree () at drivers/of/fdt.c:1236
    1236            __unflatten_device_tree(initial_boot_params, NULL, &of_root,
    (gdb) bt
    #0  unflatten_device_tree () at drivers/of/fdt.c:1236
    #1  0xffffffff80c03188 in setup_arch (cmdline_p=0xffffffff81803fa0) at arch/riscv/kernel/setup.c:280
    #2  0xffffffff80c0082e in start_kernel () at init/main.c:939
    #3  0xffffffff80001182 in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) list
    1231     * pointers of the nodes so the normal device-tree walking functions
    1232     * can be used.
    1233     */
    1234    void __init unflatten_device_tree(void)
    1235    {
    1236            __unflatten_device_tree(initial_boot_params, NULL, &of_root,
    1237                                    early_init_dt_alloc_memory_arch, false);
    1238
    1239            /* Get pointer to "/chosen" and "/aliases" nodes for use everywhere */
    1240            of_alias_scan(early_init_dt_alloc_memory_arch);
    (gdb) b __unflatten_device_tree
    Breakpoint 3 at 0xffffffff809457ec: __unflatten_device_tree. (2 locations)
    (gdb) c
    Continuing.
    
    Breakpoint 3, 0xffffffff809457ec in __unflatten_device_tree () at drivers/of/fdt.c:129
    129                             continue;
    (gdb) bt
    #0  0xffffffff809457ec in __unflatten_device_tree () at drivers/of/fdt.c:129
    #1  0xffffffff80c2cb6e in unflatten_device_tree () at drivers/of/fdt.c:1236
    #2  0xffffffff80c03188 in setup_arch (cmdline_p=0xffffffff81803fa0) at arch/riscv/kernel/setup.c:280
    #3  0xffffffff80c0082e in start_kernel () at init/main.c:939
    #4  0xffffffff80001182 in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) list
    124                     u32 sz;
    125
    126                     val = fdt_getprop_by_offset(blob, cur, &pname, &sz);
    127                     if (!val) {
    128                             pr_warn("Cannot locate property at 0x%x
    ", cur);
    129                             continue;
    130                     }
    131
    132                     if (!pname) {
    133                             pr_warn("Cannot find property name at 0x%x
    ", cur);
    (gdb) s
    
    Breakpoint 3, __unflatten_device_tree (blob=0xffffffe002000000, dad=dad@entry=0x0, mynodes=0xffffffff81a27838 <of_root>, dt_alloc=dt_alloc@entry=0xffffffff80c2b9ce <early_init_dt_alloc_memory_arch>, detached=detached@entry=false) at drivers/of/fdt.c:378
    378             if (mynodes)
    (gdb) n
    379                     *mynodes = NULL;
    (gdb) list
    374             int size;
    375             void *mem;
    376             int ret;
    377
    378             if (mynodes)
    379                     *mynodes = NULL;
    380
    381             pr_debug(" -> unflatten_device_tree()
    ");
    382
    383             if (!blob) {
    (gdb) n
    383             if (!blob) {
    (gdb) n
    393             if (fdt_check_header(blob)) {
    (gdb) n
    399             size = unflatten_dt_nodes(blob, NULL, dad, NULL);
    (gdb) p *blob
    Attempt to dereference a generic pointer.
    (gdb) p blob
    $1 = (const void *) 0xffffffe002000000
    (gdb) n
    400             if (size <= 0)
    (gdb) c
    Continuing.

     uboot

    [root@centos7 riscv_debug]# git clone https://gitlab.denx.de/u-boot/u-boot.git --depth 1
    Cloning into 'u-boot'...
    remote: Enumerating objects: 19347, done.
    remote: Counting objects: 100% (19347/19347), done.
    remote: Compressing objects: 100% (17268/17268), done.
    remote: Total 19347 (delta 3213), reused 6977 (delta 1739), pack-reused 0
    Receiving objects: 100% (19347/19347), 25.13 MiB | 7.20 MiB/s, done.
    Resolving deltas: 100% (3213/3213), done.
    
    [root@centos7 riscv_debug]# make qemu-riscv64_smode_defconfig CROSS_COMPILE=iscv64-unknown-linux-gnu-
    make: *** No rule to make target 'qemu-riscv64_smode_defconfig'.  Stop.
    
    [root@centos7 riscv_debug]# 
    [root@centos7 riscv_debug]# cd u-boot/
     make  CROSS_COMPILE=riscv64-unknown-linux-gnu-  -j128


    make[1]: *** [scripts/Makefile.host:104: tools/fit_info] Error 1
    tools/libtools//ecdsalib//ecdsaecdsa-/libcrypto.oecdsa:- libcrypto.oIn: functionIn `functionprepare_ctx '`:prepare_ctx
    'ecdsa:-
    libcrypto.cecdsa:-(libcrypto.c.:text(+.0x98text)+:0x98 )undefined: referenceundefined toreference `toOPENSSL_init_ssl '`
    OPENSSL_init_sslecdsa'-
    libcrypto.cecdsa:-(libcrypto.c.:text(+.0x130text)+:0x130 )undefined: referenceundefined toreference `toEC_GROUP_order_bits '`
    EC_GROUP_order_bitstools'/
    libtools//ecdsalib//ecdsaecdsa-/libcrypto.oecdsa:- libcrypto.oIn: functionIn `functionecdsa_check_signature.isra.3 '`:
    ecdsa_check_signature.isra.3ecdsa'-:libcrypto.c
    :ecdsa(-.libcrypto.ctext:+(0x300.)text:+ 0x300undefined) :reference undefinedto reference` ECDSA_SIG_set0to'
    `toolsECDSA_SIG_set0/'lib
    /toolsecdsa//libecdsa/-ecdsalibcrypto.o/:ecdsa -Inlibcrypto.o :function In` ecdsa_signfunction' :`
    ecdsa_signecdsa'-:libcrypto.c
    :ecdsa(-.libcrypto.ctext:+(0x3ec.)text:+ 0x3ecundefined) :reference undefinedto reference` ECDSA_SIG_get0to'
    `ecdsaECDSA_SIG_get0-'libcrypto.c
    :ecdsa(-.libcrypto.ctext:+(0x3fc.)text:+ 0x3fcundefined) :reference undefinedto reference` BN_bn2binpadto'
    `ecdsaBN_bn2binpad-'libcrypto.c
    :ecdsa(-.libcrypto.ctext:+(0x40c.)text:+ 0x40cundefined) :reference undefinedto reference` BN_bn2binpadto'
    `toolsBN_bn2binpad/'lib
    /toolsecdsa//libecdsa/-ecdsalibcrypto.o/:ecdsa -Inlibcrypto.o :function In` ecdsa_add_verify_datafunction' :`
    ecdsa_add_verify_dataecdsa'-:libcrypto.c
    :ecdsa(-.libcrypto.ctext:+(0x5a8.)text:+ 0x5a8undefined) :reference undefinedto reference` EC_GROUP_order_bitsto'
    `ecdsaEC_GROUP_order_bits-'libcrypto.c
    :ecdsa(-.libcrypto.ctext:+(0x5ec.)text:+ 0x5ecundefined) :reference undefinedto reference` toEC_POINT_get_affine_coordinates '`
    toolsEC_POINT_get_affine_coordinates/'lib
    /toolsrsa//librsa/-rsasign.o/:rsa -Insign.o :function In` rsa_signfunction' :`
    rsa_signrsa'-:sign.c
    :rsa(-.sign.ctext:+(0x4e8.)text:+ 0x4e8undefined) :reference undefinedto reference` OPENSSL_init_sslto'
    `rsaOPENSSL_init_ssl-'sign.c
    :rsa(-.sign.ctext:+(0x790.)text:+ 0x790undefined) :reference undefinedto reference` EVP_MD_CTX_resetto'
    `toolsEVP_MD_CTX_reset/'lib
    /toolsrsa//librsa/-rsasign.o/:rsa -Insign.o :function In` rsa_get_paramsfunction' :`
    rsa_get_paramsrsa'-:sign.c
    :rsa(-.sign.ctext:+(0x874.)text:+ 0x874undefined) :reference undefinedto reference` RSA_get0_keyto'
    `rsaRSA_get0_key-'sign.c
    :rsa(-.sign.ctext:+(0x8bc.)text:+ 0x8bcundefined) :reference undefinedto reference` RSA_get0_keyto'
    `toolsRSA_get0_key/'lib
    /toolsrsa//librsa/-rsasign.o/:rsa -Insign.o :function In` rsa_add_verify_datafunction' :`
    rsa_add_verify_datarsa'-:sign.c
    :rsa(-.sign.ctext:+(0xc60.)text:+ 0xc60undefined) :reference undefinedto reference` EVP_PKEY_get0_RSAto'
    `EVP_PKEY_get0_RSA'
    collect2: error: ld returned 1 exit status
    collect2: error: ld returned 1 exit status
    make[1]: *** [scripts/Makefile.host:104: tools/mkimage] Error 1
    make[1]: *** [scripts/Makefile.host:104: tools/fit_check_sign] Error 1
    make: *** [Makefile:1801: tools] Error 2

    yum -y install openssl

    UBOOT_MAKE_FLAGS += HOSTLOADLIBES_mkimage="-pthread -lcrypto -lssl"

    You may also use the following patch, submitted to u-boot:
    
    From a48643614cba7703f1ebbf92ecb5be5d73389f8a Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Benedikt-Alexander=20Mokro=C3=9F?= <bam@icognize.de>
    Date: Tue, 3 Dec 2019 09:52:34 +0100
    Subject: [PATCH] Add -pthread to HOSTLOADLIBES_mkimage
    
    On some unix distributions, pthread is not automatically linked.
    This results in unresolved symbols when e.g. building u-boot via OpenWRT (using LibreSSL) in dumpimage and other host tools when i.E. CONFIG_FIT_SIGNATURE is set.
    Using -pthread to link pthread should be portable across all distributions and OS X.
    
    CHANGELOG:
    * Added -pthread to HOSTLOADLIBES_mkimage
    ---
     tools/Makefile | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/tools/Makefile b/tools/Makefile
    index 24581adccd..2f122bed8e 100644
    --- a/tools/Makefile
    +++ b/tools/Makefile
    @@ -150,7 +150,8 @@ ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_ARMADA_38X)$(CONFIG_ARMADA_39X)$(CON
     HOSTCFLAGS_kwbimage.o += 
         $(shell pkg-config --cflags libssl libcrypto 2> /dev/null || echo "")
     HOSTLOADLIBES_mkimage += 
    -    $(shell pkg-config --libs libssl libcrypto 2> /dev/null || echo "-lssl -lcrypto")
    +    $(shell pkg-config --libs libssl libcrypto 2> /dev/null || echo "-lssl -lcrypto") 
    +    -pthread
     
     # OS X deprecate openssl in favour of CommonCrypto, supress deprecation
     # warnings on those systems
    -- 
    2.20.1

    Booting with qemu

    Prerequisites:

    • apt install qemu-system-misc opensbi u-boot-qemu qemu-utils

    Hirsute's version of u-boot-qemu is required at the moment to boot hirsute images.

    After installing the above prerequisites, one can use any of the above images to boot virtual machine.

    First unpack the image

     

    xz -dk focal-preinstalled-server-riscv64.img.xz

    Optionally, if you want larger disk, you can expand the disk (filesystem will be automatically resized too).

     

    qemu-img resize -f raw focal-preinstalled-server-riscv64.img +5G

    Next use OpenSBI bootloader & u-boot-qemu to boot the virtual machine

    Working example with all the options is:

     

    qemu-system-riscv64 
    -machine virt -nographic -m 2048 -smp 4 
    -bios /usr/lib/riscv64-linux-gnu/opensbi/generic/fw_jump.elf 
    -kernel /usr/lib/u-boot/qemu-riscv64_smode/uboot.elf 
    -device virtio-net-device,netdev=eth0 -netdev user,id=eth0 
    -drive file=focal-preinstalled-server-riscv64.img,format=raw,if=virtio

    The important options to use are:

    • Machine type virt aka -machine virt

    • Bios is OpenSBI -bios /usr/lib/riscv64-linux-gnu/opensbi/generic/fw_jump.elf

    • "kernel" is qemu smode uboot -kernel /usr/lib/u-boot/qemu-riscv64_smode/uboot.elf

    One can use pass through networking, adjust memory (-m) & cpu counts (-smp) as needed.

    Switch to the serial console, wait for cloud-init to complete, then login using ubuntu:ubuntu. See the cloud-init section below to further customise the first boot behaviour with cloud-init.

    _start_kernel () at arch/riscv/kernel/head.S:327

    [root@centos7 linux-5.14]# riscv64-unknown-elf-gdb vmlinux
    GNU gdb (GDB) 11.1
    Copyright (C) 2021 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    Type "show copying" and "show warranty" for details.
    This GDB was configured as "--host=aarch64-unknown-linux-gnu --target=riscv64-unknown-elf".
    Type "show configuration" for configuration details.
    For bug reporting instructions, please see:
    <https://www.gnu.org/software/gdb/bugs/>.
    Find the GDB manual and other documentation resources online at:
        <http://www.gnu.org/software/gdb/documentation/>.
    
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from vmlinux...
    (gdb) target remote :1234
    Remote debugging using :1234
    warning: Can not parse XML target description; XML support was disabled at compile time
    0x0000000000001000 in ?? ()
    (gdb) b sbi_console_write
    Breakpoint 1 at 0xffffffff80193634: file drivers/tty/serial/earlycon-riscv-sbi.c, line 24.
    (gdb) b early_sbi_setup
    Breakpoint 2 at 0xffffffff8021407c: file drivers/tty/serial/earlycon-riscv-sbi.c, line 31.
    (gdb) c
    Continuing.
    
    Breakpoint 2, early_sbi_setup (device=0xffffffff80a91658 <early_console_dev>, opt=0x0) at drivers/tty/serial/earlycon-riscv-sbi.c:31
    31              device->con->write = sbi_console_write;
    (gdb) bt
    #0  early_sbi_setup (device=0xffffffff80a91658 <early_console_dev>, opt=0x0)
        at drivers/tty/serial/earlycon-riscv-sbi.c:31
    #1  0xffffffff80213c08 in register_earlycon (match=<optimized out>, buf=0x0) at drivers/tty/serial/earlycon.c:147
    #2  setup_earlycon (buf=<optimized out>) at drivers/tty/serial/earlycon.c:205
    #3  0xffffffff80213cc4 in param_setup_earlycon (buf=<optimized out>) at drivers/tty/serial/earlycon.c:237
    #4  0xffffffff802001c4 in do_early_param (param=0xffffffff80400218 <tmp_cmdline> "earlycon", 
        val=0xffffffff80400221 <tmp_cmdline+9> "sbi", unused=<optimized out>, arg=<optimized out>) at init/main.c:735
    #5  0xffffffff8002867c in parse_one (handle_unknown=0xffffffff80200124 <do_early_param>, arg=0x0, 
        max_level=<optimized out>, min_level=<optimized out>, num_params=0, params=0x0, 
        doing=0xffffffff80648e48 "early options", val=0xffffffff80400221 <tmp_cmdline+9> "sbi", 
        param=0xffffffff80400218 <tmp_cmdline> "earlycon") at kernel/params.c:153
    #6  parse_args (doing=doing@entry=0xffffffff80648e48 "early options", 
        args=0xffffffff80400224 <tmp_cmdline+12> "", args@entry=0xffffffff80400218 <tmp_cmdline> "earlycon", 
        params=params@entry=0x0, num=num@entry=0, min_level=min_level@entry=0, max_level=max_level@entry=0, 
        arg=arg@entry=0x0, unknown=unknown@entry=0xffffffff80200124 <do_early_param>) at kernel/params.c:188
    #7  0xffffffff80200940 in parse_early_options (cmdline=cmdline@entry=0xffffffff80400218 <tmp_cmdline> "earlycon")
        at init/main.c:745
    #8  0xffffffff802009a0 in parse_early_param () at init/main.c:760
    #9  0xffffffff80202400 in setup_arch (cmdline_p=cmdline_p@entry=0xffffffff80a03f98)
        at arch/riscv/kernel/setup.c:272
    #10 0xffffffff80200b00 in start_kernel () at init/main.c:939
    #11 0xffffffff8000016c in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 1, sbi_console_write (con=0xffffffff80a91860 <early_con>, s=0xffffffff80aaaa88 <text> "[    0.000000] Linux version 5.14.0 (root@centos7) (riscv64-unknown-elf-gcc (GCC) 11.1.0, GNU ld (GNU Binutils) 2.37) #2 Thu Oct 21 02:50:49 EDT 2021
    ", n=150) at drivers/tty/serial/earlycon-riscv-sbi.c:24
    24              for ( i= 0; i < n; ++i)
    (gdb) bt
    #0  sbi_console_write (con=0xffffffff80a91860 <early_con>, 
        s=0xffffffff80aaaa88 <text> "[    0.000000] Linux version 5.14.0 (root@centos7) (riscv64-unknown-elf-gcc (GCC) 11.1.0, GNU ld (GNU Binutils) 2.37) #2 Thu Oct 21 02:50:49 EDT 2021
    ", n=150)
        at drivers/tty/serial/earlycon-riscv-sbi.c:24
    #1  0xffffffff80042094 in call_console_drivers (ext_text=0xffffffff80aaaec8 <ext_text> "", 
        text=0xffffffff80aaaa88 <text> "[    0.000000] Linux version 5.14.0 (root@centos7) (riscv64-unknown-elf-gcc (GCC) 11.1.0, GNU ld (GNU Binutils) 2.37) #2 Thu Oct 21 02:50:49 EDT 2021
    ", len=<optimized out>, 
        ext_len=<optimized out>) at kernel/printk/printk.c:1938
    #2  console_unlock () at kernel/printk/printk.c:2643
    #3  0xffffffff80042af4 in register_console (newcon=0xffffffff80a91860 <early_con>) at kernel/printk/printk.c:2981
    #4  0xffffffff80213c30 in register_earlycon (match=<optimized out>, buf=0x0) at drivers/tty/serial/earlycon.c:154
    #5  setup_earlycon (buf=<optimized out>) at drivers/tty/serial/earlycon.c:205
    #6  0xffffffff80213cc4 in param_setup_earlycon (buf=<optimized out>) at drivers/tty/serial/earlycon.c:237
    #7  0xffffffff802001c4 in do_early_param (param=0xffffffff80400218 <tmp_cmdline> "earlycon", 
        val=0xffffffff80400221 <tmp_cmdline+9> "sbi", unused=<optimized out>, arg=<optimized out>) at init/main.c:735
    #8  0xffffffff8002867c in parse_one (handle_unknown=0xffffffff80200124 <do_early_param>, arg=0x0, 
        max_level=<optimized out>, min_level=<optimized out>, num_params=0, params=0x0, 
        doing=0xffffffff80648e48 "early options", val=0xffffffff80400221 <tmp_cmdline+9> "sbi", 
        param=0xffffffff80400218 <tmp_cmdline> "earlycon") at kernel/params.c:153
    #9  parse_args (doing=doing@entry=0xffffffff80648e48 "early options", 
        args=0xffffffff80400224 <tmp_cmdline+12> "", args@entry=0xffffffff80400218 <tmp_cmdline> "earlycon", 
        params=params@entry=0x0, num=num@entry=0, min_level=min_level@entry=0, max_level=max_level@entry=0, 
        arg=arg@entry=0x0, unknown=unknown@entry=0xffffffff80200124 <do_early_param>) at kernel/params.c:188
    #10 0xffffffff80200940 in parse_early_options (cmdline=cmdline@entry=0xffffffff80400218 <tmp_cmdline> "earlycon")
        at init/main.c:745
    #11 0xffffffff802009a0 in parse_early_param () at init/main.c:760
    #12 0xffffffff80202400 in setup_arch (cmdline_p=cmdline_p@entry=0xffffffff80a03f98)

    Boot HART ID              : 0
    Boot HART Domain          : root
    Boot HART ISA             : rv64imafdcsu
    Boot HART Features        : scounteren,mcounteren
    Boot HART PMP Count       : 16
    Boot HART PMP Granularity : 4
    Boot HART PMP Address Bits: 54
    Boot HART MHPM Count      : 0
    Boot HART MHPM Count      : 0
    Boot HART MIDELEG         : 0x0000000000000222
    Boot HART MEDELEG         : 0x000000000000b109
    [    0.000000] Linux version 5.14.0 (root@centos7) (riscv64-unknown-elf-gcc (GCC) 11.1.0, GNU ld (GNU Binutils) 2.37) #2 Thu Oct 21 02:50:49 EDT 2021

    riscv Kernel panic - not syncing: No working init found 

    [root@centos7 images]# file rootfs.ext2 
    rootfs.ext2: Linux rev 1.0 ext2 filesystem data, UUID=f782840d-9251-495d-b646-32800af3ca12 (large files)
    [root@centos7 images]# ls /data
    data/  data1/ data2/ data3/ 
    [root@centos7 images]# ls /data3/
    boot  lost+found
    [root@centos7 images]# mkdir /data4
    [root@centos7 images]# mount rootfs.ext2  /data4
    [root@centos7 images]# ls /data4/
    bin  dev  etc  lib  lib64  linuxrc  lost+found  media  mnt  opt  proc  root  run  sbin  sys  tmp  usr  var
    [root@centos7 images]# ls /data4/bin/
    arch     chgrp  df             fdflush   kill     lsattr      mt       pipe_progress  run-parts  stty    uname
    ash      chmod  dmesg          fgrep     link     mkdir       mv       printenv       sed        su      usleep
    base32   chown  dnsdomainname  getopt    linux32  mknod       netstat  ps             setarch    sync    vi
    base64   cp     dumpkmap       grep      linux64  mktemp      nice     pwd            setpriv    tar     watch
    busybox  cpio   echo           gunzip    ln       more        nuke     resume         setserial  touch   zcat
    cat      date   egrep          gzip      login    mount       pidof    rm             sh         true
    chattr   dd     false          hostname  ls       mountpoint  ping     rmdir          sleep      umount
    [root@centos7 images]# 
    [root@centos7 linux-5.14.g]# gdb vmlinux
    GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
    Copyright (C) 2013 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "aarch64-redhat-linux-gnu".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>...
    Reading symbols from /root/riscv_debug/linux-5.14.g/vmlinux...Dwarf Error: wrong version in compilation unit header (is 5, should be 2, 3, or 4) [in module /root/riscv_debug/linux-5.14.g/vmlinux]
    (no debugging symbols found)...done.
    (gdb) target remote:1234
    Remote debugging using :1234
    warning: Architecture rejected target-supplied description
    0x0000000000001000 in ?? ()
    (gdb) b try_to_run_init_process
    Breakpoint 1 at 0xffffffff8016276e
    (gdb) b print_trace_address
    Breakpoint 2 at 0xffffffff80162984
    (gdb) c
    Continuing.
    
    Breakpoint 1, 0xffffffff8016276e in try_to_run_init_process ()
    (gdb) bt
    #0  0xffffffff8016276e in try_to_run_init_process ()
    #1  0x000000000000003d in ?? ()
    Backtrace stopped: previous frame identical to this frame (corrupt stack?)
    (gdb) info f
    Stack level 0, frame at 0xffffffd00400bec0:
     pc = 0xffffffff8016276e in try_to_run_init_process; saved pc 0x3d
     called by frame at 0xffffffd00400bec0
     Arglist at unknown address.
     Locals at unknown address, Previous frame's sp is 0xffffffd00400bec0
    Could not fetch register "v31"; remote failure reply 'E14'
    (gdb) info registers
    x0             0x0      0
    x1             0xffffffff8016517a       -2146020998
    x2             0xffffffd00400bec0       -206091272512
    x3             0xffffffff80aa1b80       -2136335488
    x4             0xffffffe000ef0000       -137423290368
    x5             0x40     64
    x6             0x0      0
    x7             0xd      13
    x8             0xffffffd00400bee0       -206091272480
    x9             0xffffffff80aa2028       -2136334296
    x10            0xffffffff806520b8       -2140856136
    x11            0x13d    317
    x12            0xffffffe000e3db60       -137424020640
    x13            0xffffffe03eff0060       -136382054304
    x14            0x13c    316
    x15            0x2      2
    x16            0xffffffe000e3daf0       -137424020752
    x17            0x9      9
    x18            0x0      0
    x19            0x0      0
    x20            0x0      0
    x21            0x0      0
    ---Type <return> to continue, or q <return> to quit---
    x22            0x0      0
    x23            0x0      0
    x24            0x0      0
    x25            0x0      0
    x26            0x0      0
    x27            0x0      0
    x28            0xffffffff8061fde8       -2141061656
    x29            0x22     34
    x30            0x3d     61
    sp             0x0      0x0
    pc             0xffffffff8016276e       0xffffffff8016276e <try_to_run_init_process>
    cpsr           0x0      0
    fpsr           0x0      0
    fpcr           0x0      0
    (gdb) 
    (gdb) 
    (gdb) c
    Continuing.
    
    Breakpoint 1, 0xffffffff8016276e in try_to_run_init_process ()
    (gdb) bt
    #0  0xffffffff8016276e in try_to_run_init_process ()
    #1  0x000000000000003d in ?? ()
    Backtrace stopped: previous frame identical to this frame (corrupt stack?)
    (gdb) c

    gdb 错了[root@centos7 linux-5.14.g]# riscv64-unknown-elf-gdb vmlinuxGNU gdb (GDB) 1Copyright (C) 2021 Free Software Foundation, InLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    Type "show copying" and "show warranty" for details.
    This GDB was configured as "--host=aarch64-unknown-linux-gnu --target=riscv64-unknown-elf".
    Type "show configuration" for configuration details.
    For bug reporting instructions, please see:
    <https://www.gnu.org/software/gdb/bugs/>.
    Find the GDB manual and other documentation resources online at:
        <http://www.gnu.org/software/gdb/documentation/>.
    
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from vmlinux...
    (gdb) b try_to_run_init_process
    Breakpoint 1 at 0xffffffff8016276e: file init/main.c, line 1437.
    (gdb) b print_trace_address
    Breakpoint 2 at 0xffffffff80162984: file arch/riscv/kernel/stacktrace.c, line 104.
    (gdb) c
    The program is not being run.
    (gdb) target remote:1234
    Remote debugging using :1234
    warning: Can not parse XML target description; XML support was disabled at compile time
    0x0000000000001000 in ?? ()
    (gdb) b try_to_run_init_process
    Note: breakpoint 1 also set at pc 0xffffffff8016276e.
    Breakpoint 3 at 0xffffffff8016276e: file init/main.c, line 1437.
    (gdb) b print_trace_address
    Note: breakpoint 2 also set at pc 0xffffffff80162984.
    Breakpoint 4 at 0xffffffff80162984: file arch/riscv/kernel/stacktrace.c, line 104.
    (gdb) c
    Continuing.
    
    Breakpoint 1, try_to_run_init_process (init_filename=init_filename@entry=0xffffffff806520b8 "/sbin/init") at init/main.c:1437
    1437            ret = run_init_process(init_filename);
    (gdb) bt
    #0  try_to_run_init_process (init_filename=init_filename@entry=0xffffffff806520b8 "/sbin/init") at init/main.c:1437
    #1  0xffffffff8016517a in kernel_init (unused=<optimized out>) at init/main.c:1554
    #2  0xffffffff8000299c in handle_exception () at arch/riscv/kernel/entry.S:232
    Backtrace stopped: frame did not save the PC
    (gdb) p 0xffffffff806520b8
    $1 = 18446744071568695480
    (gdb) info registers
    ra             0xffffffff8016517a       0xffffffff8016517a <kernel_init+200>
    sp             0xffffffd00400bec0       0xffffffd00400bec0
    gp             0xffffffff80aa1b80       0xffffffff80aa1b80
    tp             0xffffffe000ef0000       0xffffffe000ef0000
    t0             0x40     64
    t1             0x0      0
    t2             0xd      13
    fp             0xffffffd00400bee0       0xffffffd00400bee0
    s1             0xffffffff80aa2028       -2136334296
    a0             0xffffffff806520b8       -2140856136
    a1             0x13d    317
    a2             0xffffffe000e3db60       -137424020640
    a3             0xffffffe03eff0060       -136382054304
    a4             0x13c    316
    a5             0x2      2
    a6             0xffffffe000e3daf0       -137424020752
    a7             0x9      9
    s2             0x0      0
    s3             0x0      0
    s4             0x0      0
    s5             0x0      0
    s6             0x0      0
    --Type <RET> for more, q to quit, c to continue without paging--
    s7             0x0      0
    s8             0x0      0
    s9             0x0      0
    s10            0x0      0
    s11            0x0      0
    t3             0xffffffff8061fde8       -2141061656
    t4             0x22     34
    t5             0x3d     61
    t6             0x0      0
    pc             0xffffffff8016276e       0xffffffff8016276e <try_to_run_init_process>
    (gdb) c
    Continuing.
    
    Breakpoint 1, try_to_run_init_process (init_filename=init_filename@entry=0xffffffff806520c8 "/etc/init") at init/main.c:1437
    1437            ret = run_init_process(init_filename);
    (gdb) c
    Continuing.
    
    Breakpoint 1, try_to_run_init_process (init_filename=init_filename@entry=0xffffffff806520d8 "/bin/init") at init/main.c:1437
    1437            ret = run_init_process(init_filename);
    (gdb) c
    Continuing.
    
    Breakpoint 1, try_to_run_init_process (init_filename=init_filename@entry=0xffffffff806520e8 "/bin/sh") at init/main.c:1437
    1437            ret = run_init_process(init_filename);
    (gdb) c
    Continuing.
    
    Breakpoint 2, print_trace_address (arg=0xffffffff80663448, pc=18446744071563520692) at arch/riscv/kernel/stacktrace.c:104
    104     {
    (gdb) bt
    #0  print_trace_address (arg=0xffffffff80663448, pc=18446744071563520692) at arch/riscv/kernel/stacktrace.c:104
    #1  0xffffffff80162a30 in walk_stackframe (task=task@entry=0x0, regs=regs@entry=0x0, 
        fn=fn@entry=0xffffffff80162984 <print_trace_address>, arg=arg@entry=0xffffffff80663448)
        at arch/riscv/kernel/stacktrace.c:46
    #2  0xffffffff80162ab4 in dump_backtrace (regs=regs@entry=0x0, task=task@entry=0x0, 
        loglvl=loglvl@entry=0xffffffff80663448 "") at arch/riscv/kernel/stacktrace.c:114
    #3  0xffffffff80162ae4 in show_stack (task=task@entry=0x0, sp=sp@entry=0x0, loglvl=loglvl@entry=0xffffffff80663448 "")
        at arch/riscv/kernel/stacktrace.c:120
    #4  0xffffffff80164f04 in __dump_stack (log_lvl=0xffffffff80663448 "") at lib/dump_stack.c:88
    #5  dump_stack_lvl (log_lvl=0xffffffff80663448 "") at lib/dump_stack.c:105
    #6  dump_stack () at lib/dump_stack.c:112
    #7  0xffffffff80162c1e in panic (
        fmt=fmt@entry=0xffffffff806520f0 "No working init found.  Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance.") at kernel/panic.c:232
    #8  0xffffffff801651b2 in kernel_init (unused=<optimized out>) at init/main.c:1560
    #9  0xffffffff8000299c in handle_exception () at arch/riscv/kernel/entry.S:232 ----调用
    handle_syscall_trace_exit
    Backtrace stopped: frame did not save the PC (gdb) n 105 const char *loglvl = arg; (gdb) p *arg Attempt to dereference a generic pointer. (gdb) p *loglvl value has been optimized out (gdb) n 106 pr_cont("yuncong************* %s[<%px>] %pS ", loglvl, (void *) pc, (void *) pc); (gdb) n 107 print_ip_sym(loglvl, pc); (gdb) p loglvl $2 = 0xffffffff80663448 "" (gdb) p *loglvl $3 = 0 '00' (gdb) c Continuing. Breakpoint 2, print_trace_address (arg=0xffffffff80663448, pc=18446744071563529988) at arch/riscv/kernel/stacktrace.c:104 104 { (gdb) c Continuing. Breakpoint 2, print_trace_address (arg=0xffffffff80663448, pc=18446744071563521054) at arch/riscv/kernel/stacktrace.c:104 104 { (gdb)

    arch/riscv/kernel/entry.S :232

        228 ret_from_syscall_rejected:
        229         /* Trace syscalls, but only if requested by the user. */
        230         REG_L t0, TASK_TI_FLAGS(tp)
        231         andi t0, t0, _TIF_SYSCALL_WORK
        232         bnez t0, handle_syscall_trace_exit

    make: *** [Makefile:1851: arch/riscv] Error 2

    make[1]: *** [scripts/Makefile.build:514: arch/riscv/kernel] Error 2
    make[1]: *** Waiting for unfinished jobs....
      AR      drivers/soc/bcm/built-in.a
      CC      fs/proc/proc_tty.o
      AR      fs/devpts/built-in.a
      CC      fs/select.o
      AR      drivers/soc/fsl/built-in.a
      AR      drivers/reset/hisilicon/built-in.a
      AR      drivers/clk/bcm/built-in.a
      CC      drivers/reset/core.o
      CC      drivers/reset/reset-simple.o
      AR      arch/riscv/mm/built-in.a
      AR      fs/ramfs/built-in.a
      CC      drivers/tty/vt/vt_ioctl.o
      AR      drivers/clk/imgtec/built-in.a
      CC      fs/dcache.o
      AR      drivers/soc/imx/built-in.a
      CC      drivers/tty/vt/vc_screen.o
      CC      drivers/char/mem.o
    make: *** [Makefile:1851: arch/riscv] Error 2
    make: *** Waiting for unfinished jobs....

      kernel_init

     arch/riscv/kernel/head.S:184:setup_trap_vector

    .align 2
    setup_trap_vector:
            /* Set trap vector to exception handler */
            la a0, handle_exception
            csrw CSR_TVEC, a0
    
            /*
             * Set sup0 scratch register to 0, indicating to exception vector that
             * we are presently executing in kernel.
             */
            csrw CSR_SCRATCH, zero
            ret
    
    .Lsecondary_park:
            /* We lack SMP support or have too many harts, so park this hart */
            wfi
            j .Lsecondary_park
    
    END(_start)

    当一个hart(Risc-V的一个硬件线程)发生异常时,硬件会将异常指令的PC保存在mepc寄存器中。Risc-V还支持向量中断,即若将mtvec[0]设置为1,则表示mtvec中保存的是中断向量的起始地址,因此PC实际上是会根据中断原因 x(mcause中的值)将PC设置为(mtvec - 1 + 4x)。而mtvec寄存器的值是系统程序员来设置的,一般在CPU一开始执行代码时就设置mtvec寄存器,其值是中断向量的起始地址。

    其中:

    a. 把handle_exception的地址填入mtvec寄存器,作为中断向量表的基地址;handle_exception在entry.S中定义,其定义如下:

    ENTRY(handle_exception)
            /*
             * If coming from userspace, preserve the user thread pointer and load
             * the kernel thread pointer.  If we came from the kernel, the scratch
             * register will contain 0, and we should continue on the current TP.
             */
            csrrw tp, CSR_SCRATCH, tp
            bnez tp, _save_context
    
    _restore_kernel_tpsp:
            csrr tp, CSR_SCRATCH
            REG_S sp, TASK_TI_KERNEL_SP(tp)
    
    #ifdef CONFIG_VMAP_STACK
            addi sp, sp, -(PT_SIZE_ON_STACK)
            srli sp, sp, THREAD_SHIFT
            andi sp, sp, 0x1

    . handle_arch_irq

    handle_arch_irq是一个变量,其中存放了中断处理程序的地址

    内核启动异常--entry.S

    [root@centos7 riscv]# grep handle_exception -rn *
    kernel/kgdb.c:298:int kgdb_arch_handle_exception(int vector, int signo, int err_code,
    kernel/kgdb.c:351:      if (kgdb_handle_exception(type == KGDB_SW_SINGLE_STEP ? 0 : 1,
    kernel/head.S:186:      la a0, handle_exception
    kernel/entry.S:21:ENTRY(handle_exception)
    kernel/entry.S:175:      * handle_exception did not do set SR_IE as it always sees SR_PIE
    kernel/entry.S:487:END(handle_exception)
      LD [M]  fs/efivarfs/efivarfs.ko
    [root@centos7 linux-5.14.g]#  riscv64-unknown-elf-gdb    vmlinux
    GNU gdb (GDB) 11.1
    Copyright (C) 2021 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    Type "show copying" and "show warranty" for details.
    This GDB was configured as "--host=aarch64-unknown-linux-gnu --target=riscv64-unknown-elf".
    Type "show configuration" for configuration details.
    For bug reporting instructions, please see:
    <https://www.gnu.org/software/gdb/bugs/>.
    Find the GDB manual and other documentation resources online at:
        <http://www.gnu.org/software/gdb/documentation/>.
    
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from vmlinux...
    (gdb) target remote:1234
    Remote debugging using :1234
    warning: Can not parse XML target description; XML support was disabled at compile time
    0x0000000000001000 in ?? ()
    (gdb) b arch/riscv/kernel/entry.S:232
    Breakpoint 1 at 0xffffffff8000300c: file arch/riscv/kernel/entry.S, line 232.
    (gdb) b handle_exception
    Breakpoint 2 at 0xffffffff80002ed4: file arch/riscv/kernel/entry.S, line 27.
    (gdb) c
    Continuing.
    
    Breakpoint 2, handle_exception () at arch/riscv/kernel/entry.S:27
    27              csrrw tp, CSR_SCRATCH, tp
    (gdb) bt
    #0  handle_exception () at arch/riscv/kernel/entry.S:27
    #1  0xffffffff8004d04e in try_enable_new_console (newcon=newcon@entry=0xffffffff81296ae8 <vt_console_driver>, 
        user_specified=user_specified@entry=true) at kernel/printk/printk.c:2817
    #2  0xffffffff8004e2a8 in register_console (newcon=newcon@entry=0xffffffff81296ae8 <vt_console_driver>)
        at kernel/printk/printk.c:2921
    #3  0xffffffff808193e8 in con_init () at drivers/tty/vt/vt.c:3505
    #4  0xffffffff80807a30 in console_init () at kernel/printk/printk.c:3091
    #5  0xffffffff80800bf0 in start_kernel () at init/main.c:1061
    #6  0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 2, handle_exception () at arch/riscv/kernel/entry.S:27
    27              csrrw tp, CSR_SCRATCH, tp
    (gdb) bt
    #0  handle_exception () at arch/riscv/kernel/entry.S:27
    #1  0xffffffff80819d4c in serial8250_isa_init_ports () at drivers/tty/serial/8250/8250_core.c:517
    #2  0xffffffff81203f60 in init_thread_union ()
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 2, handle_exception () at arch/riscv/kernel/entry.S:27
    27              csrrw tp, CSR_SCRATCH, tp
    (gdb) bt
    #0  handle_exception () at arch/riscv/kernel/entry.S:27
    #1  0xffffffff8004d04e in try_enable_new_console (newcon=newcon@entry=0xffffffff8129bf78 <sifive_serial_console>, 
        user_specified=user_specified@entry=true) at kernel/printk/printk.c:2817
    #2  0xffffffff8004e2a8 in register_console (newcon=newcon@entry=0xffffffff8129bf78 <sifive_serial_console>)
        at kernel/printk/printk.c:2921
    #3  0xffffffff8081a1e2 in sifive_console_init () at drivers/tty/serial/sifive.c:877
    #4  0xffffffff80807a30 in console_init () at kernel/printk/printk.c:3091
    #5  0xffffffff80800bf0 in start_kernel () at init/main.c:1061
    #6  0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 2, handle_exception () at arch/riscv/kernel/entry.S:27
    27              csrrw tp, CSR_SCRATCH, tp
    (gdb) bt
    #0  handle_exception () at arch/riscv/kernel/entry.S:27
    #1  0xffffffff8070c69e in __raw_spin_unlock_irqrestore (flags=549755813888, 
        lock=lock@entry=0xffffffff8128a540 <pcpu_lock>) at ./include/linux/spinlock_api_smp.h:159
    #2  _raw_spin_unlock_irqrestore (lock=lock@entry=0xffffffff8128a540 <pcpu_lock>, flags=flags@entry=2)
        at kernel/locking/spinlock.c:191
    #3  0xffffffff800e9d6c in spin_unlock_irqrestore (flags=2, lock=0xffffffff8128a540 <pcpu_lock>)
        at ./include/linux/spinlock.h:409
    #4  pcpu_alloc (size=<optimized out>, size@entry=11, align=<optimized out>, align@entry=1, 
        reserved=reserved@entry=false, gfp=<optimized out>, gfp@entry=3264) at mm/percpu.c:1854
    #5  0xffffffff800ea126 in __alloc_percpu (size=size@entry=11, align=align@entry=1) at mm/percpu.c:1954
    #6  0xffffffff8082f2ec in setup_zone_pageset (zone=zone@entry=0xffffffff812cc440 <contig_page_data>)
        at mm/page_alloc.c:6936
    #7  0xffffffff8080d546 in setup_per_cpu_pageset () at mm/page_alloc.c:6962
    #8  0xffffffff80800cde in start_kernel () at init/main.c:1092
    #9  0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) 
    ===========================================================================
    (gdb) c
    Continuing.
    
    Breakpoint 2, handle_exception () at arch/riscv/kernel/entry.S:27
    27              csrrw tp, CSR_SCRATCH, tp
    (gdb) bt
    #0  handle_exception () at arch/riscv/kernel/entry.S:27
    #1  0xffffffff8070c69e in __raw_spin_unlock_irqrestore (flags=549755813888, 
        lock=lock@entry=0xffffffff8128a540 <pcpu_lock>) at ./include/linux/spinlock_api_smp.h:159
    #2  _raw_spin_unlock_irqrestore (lock=lock@entry=0xffffffff8128a540 <pcpu_lock>, flags=flags@entry=2)
        at kernel/locking/spinlock.c:191
    #3  0xffffffff800e9d6c in spin_unlock_irqrestore (flags=2, lock=0xffffffff8128a540 <pcpu_lock>)
        at ./include/linux/spinlock.h:409
    #4  pcpu_alloc (size=<optimized out>, size@entry=11, align=<optimized out>, align@entry=1, 
        reserved=reserved@entry=false, gfp=<optimized out>, gfp@entry=3264) at mm/percpu.c:1854
    #5  0xffffffff800ea126 in __alloc_percpu (size=size@entry=11, align=align@entry=1) at mm/percpu.c:1954
    #6  0xffffffff8082f2ec in setup_zone_pageset (zone=zone@entry=0xffffffff812cc440 <contig_page_data>)
        at mm/page_alloc.c:6936
    #7  0xffffffff8080d546 in setup_per_cpu_pageset () at mm/page_alloc.c:6962
    #8  0xffffffff80800cde in start_kernel () at init/main.c:1092
    #9  0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 2, handle_exception () at arch/riscv/kernel/entry.S:27
    27              csrrw tp, CSR_SCRATCH, tp
    (gdb) bt
    #0  handle_exception () at arch/riscv/kernel/entry.S:27
    #1  0xffffffff8070c69e in __raw_spin_unlock_irqrestore (flags=4503599627370496, 
        lock=lock@entry=0xffffffff8128a540 <pcpu_lock>) at ./include/linux/spinlock_api_smp.h:159
    #2  _raw_spin_unlock_irqrestore (lock=lock@entry=0xffffffff8128a540 <pcpu_lock>, flags=flags@entry=2)
        at kernel/locking/spinlock.c:191
    #3  0xffffffff800e9d6c in spin_unlock_irqrestore (flags=2, lock=0xffffffff8128a540 <pcpu_lock>)
        at ./include/linux/spinlock.h:409
    #4  pcpu_alloc (size=<optimized out>, size@entry=208, align=<optimized out>, align@entry=8, 
        reserved=reserved@entry=false, gfp=<optimized out>, gfp@entry=3264) at mm/percpu.c:1854
    #5  0xffffffff800ea126 in __alloc_percpu (size=size@entry=208, align=align@entry=8) at mm/percpu.c:1954
    #6  0xffffffff8082f2fc in setup_zone_pageset (zone=zone@entry=0xffffffff812cc440 <contig_page_data>)
        at mm/page_alloc.c:6938
    #7  0xffffffff8080d546 in setup_per_cpu_pageset () at mm/page_alloc.c:6962
    #8  0xffffffff80800cde in start_kernel () at init/main.c:1092
    #9  0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 2, handle_exception () at arch/riscv/kernel/entry.S:27
    27              csrrw tp, CSR_SCRATCH, tp
    (gdb) bt
    #0  handle_exception () at arch/riscv/kernel/entry.S:27
    #1  0xffffffff800ea126 in __alloc_percpu (size=<optimized out>, align=<optimized out>) at mm/percpu.c:1954
    #2  0xffffffff800ea126 in __alloc_percpu (size=size@entry=40, align=align@entry=1) at mm/percpu.c:1954
    #3  0xffffffff8080d570 in setup_per_cpu_pageset () at mm/page_alloc.c:6980
    #4  0xffffffff80800cde in start_kernel () at init/main.c:1092
    #5  0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 2, handle_exception () at arch/riscv/kernel/entry.S:27
    27              csrrw tp, CSR_SCRATCH, tp
    (gdb) bt
    #0  handle_exception () at arch/riscv/kernel/entry.S:27
    #1  0xffffffff8070c69e in __raw_spin_unlock_irqrestore (flags=288230376151711744, 
        lock=lock@entry=0xffffffff8128a540 <pcpu_lock>) at ./include/linux/spinlock_api_smp.h:159
    #2  _raw_spin_unlock_irqrestore (lock=lock@entry=0xffffffff8128a540 <pcpu_lock>, flags=flags@entry=2)
        at kernel/locking/spinlock.c:191
    #3  0xffffffff800e9d6c in spin_unlock_irqrestore (flags=2, lock=0xffffffff8128a540 <pcpu_lock>)
        at ./include/linux/spinlock.h:409
    #4  pcpu_alloc (size=<optimized out>, size@entry=40, align=<optimized out>, align@entry=1, 
        reserved=reserved@entry=false, gfp=<optimized out>, gfp@entry=3264) at mm/percpu.c:1854
    #5  0xffffffff800ea126 in __alloc_percpu (size=size@entry=40, align=align@entry=1) at mm/percpu.c:1954
    #6  0xffffffff8080d570 in setup_per_cpu_pageset () at mm/page_alloc.c:6980
    #7  0xffffffff80800cde in start_kernel () at init/main.c:1092
    #8  0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 2, handle_exception () at arch/riscv/kernel/entry.S:27
    27              csrrw tp, CSR_SCRATCH, tp
    (gdb) bt
    #0  handle_exception () at arch/riscv/kernel/entry.S:27
    #1  0xffffffff800c6e16 in jump_label_can_update (init=true, entry=0xffffffff80dd73b8) at kernel/jump_label.c:411
    #2  __jump_label_update (key=0xffffffff812f0ab8 <sched_clock_running>, entry=0xffffffff80dd73b8, stop=<optimized out>, 
        init=<optimized out>) at kernel/jump_label.c:436
    #3  0xffffffff800c6e16 in jump_label_can_update (init=158, entry=0xffffffff81203f60) at kernel/jump_label.c:411
    #4  __jump_label_update (key=0xffffffff80dd6430 <pcpu_unit_offsets>, 
        key@entry=0xffffffff812f0ab8 <sched_clock_running>, entry=0xffffffff81203f60, stop=<optimized out>, 
        init=<optimized out>) at kernel/jump_label.c:436
    #5  0xffffffff800c7050 in jump_label_update (key=key@entry=0xffffffff812f0ab8 <sched_clock_running>)
        at kernel/jump_label.c:830
    #6  0xffffffff800c77d6 in static_key_slow_inc_cpuslocked (key=key@entry=0xffffffff812f0ab8 <sched_clock_running>)
        at kernel/jump_label.c:144
    #7  0xffffffff800c77f6 in static_key_slow_inc (key=key@entry=0xffffffff812f0ab8 <sched_clock_running>)
        at kernel/jump_label.c:159
    #8  0xffffffff80806a90 in sched_clock_init () at kernel/sched/clock.c:455
    #9  0xffffffff80800cf2 in start_kernel () at init/main.c:1097
    #10 0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 2, handle_exception () at arch/riscv/kernel/entry.S:27
    27              csrrw tp, CSR_SCRATCH, tp
    (gdb) bt
    #0  handle_exception () at arch/riscv/kernel/entry.S:27
    #1  0xffffffff80006c76 in __sbi_rfence_v02 (fid=<optimized out>, hart_mask=<optimized out>, start=0, size=0, arg4=0, 
        arg5=<optimized out>) at arch/riscv/kernel/sbi.c:341
    #2  0xffffffff80006c76 in __sbi_rfence_v02 (fid=<optimized out>, hart_mask=<optimized out>, start=0, size=0, arg4=0, 
        arg5=<optimized out>) at arch/riscv/kernel/sbi.c:341
    #3  0xffffffff80006770 in sbi_remote_fence_i (hart_mask=hart_mask@entry=0x0) at arch/riscv/kernel/sbi.c:381
    #4  0xffffffff80007cb6 in flush_icache_all () at arch/riscv/mm/cacheflush.c:20
    #5  0xffffffff80005092 in patch_text_nosync (addr=<optimized out>, insns=<optimized out>, len=<optimized out>)
        at arch/riscv/kernel/patch.c:96
    #6  0xffffffff800070c4 in arch_jump_label_transform (entry=<optimized out>, type=<optimized out>)
        at arch/riscv/kernel/jump_label.c:39
    #7  0xffffffff800c6e32 in __jump_label_update (key=key@entry=0xffffffff812f0ab8 <sched_clock_running>, 
        entry=0xffffffff80dd73b8, stop=<optimized out>, init=<optimized out>) at kernel/jump_label.c:437
    #8  0xffffffff800c7050 in jump_label_update (key=key@entry=0xffffffff812f0ab8 <sched_clock_running>)
        at kernel/jump_label.c:830
    #9  0xffffffff800c77d6 in static_key_slow_inc_cpuslocked (key=key@entry=0xffffffff812f0ab8 <sched_clock_running>)
        at kernel/jump_label.c:144
    #10 0xffffffff800c77f6 in static_key_slow_inc (key=key@entry=0xffffffff812f0ab8 <sched_clock_running>)
        at kernel/jump_label.c:159
    #11 0xffffffff80806a90 in sched_clock_init () at kernel/sched/clock.c:455
    #12 0xffffffff80800cf2 in start_kernel () at init/main.c:1097
    #13 0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    --Type <RET> for more, q to quit, c to continue without paging--
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 2, handle_exception () at arch/riscv/kernel/entry.S:27
    27              csrrw tp, CSR_SCRATCH, tp
    (gdb) bt
    #0  handle_exception () at arch/riscv/kernel/entry.S:27
    #1  0xffffffff80806a9c in sched_clock_init () at kernel/sched/clock.c:457
    #2  0xffffffff80800cf2 in start_kernel () at init/main.c:1097
    #3  0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 2, handle_exception () at arch/riscv/kernel/entry.S:27
    27              csrrw tp, CSR_SCRATCH, tp
    (gdb) bt
    #0  handle_exception () at arch/riscv/kernel/entry.S:27
    #1  0xffffffff8004f0f6 in vprintk_emit (facility=facility@entry=0, level=<optimized out>, level@entry=-1, 
        dev_info=dev_info@entry=0x0, 
        fmt=fmt@entry=0xffffffff80d45a78 "0166Calibrating delay loop (skipped), value calculated using timer frequency.. ", args=args@entry=0xffffffff81203ea8) at kernel/printk/printk.c:2158
    #2  0xffffffff8004f202 in vprintk_default (
        fmt=fmt@entry=0xffffffff80d45a78 "0166Calibrating delay loop (skipped), value calculated using timer frequency.. ", args=args@entry=0xffffffff81203ea8) at kernel/printk/printk.c:2185
    #3  0xffffffff8004f7aa in vprintk (
        fmt=fmt@entry=0xffffffff80d45a78 "0166Calibrating delay loop (skipped), value calculated using timer frequency.. ", args=args@entry=0xffffffff81203ea8) at kernel/printk/printk_safe.c:392
    #4  0xffffffff806fccf6 in printk (
        fmt=fmt@entry=0xffffffff80d45a78 "0166Calibrating delay loop (skipped), value calculated using timer frequency.. ") at kernel/printk/printk.c:2216
    #5  0xffffffff80002ae2 in calibrate_delay () at init/calibrate.c:293
    #6  0xffffffff80800cfa in start_kernel () at init/main.c:1098
    #7  0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 2, handle_exception () at arch/riscv/kernel/entry.S:27
    27              csrrw tp, CSR_SCRATCH, tp
    (gdb) bt
    #0  handle_exception () at arch/riscv/kernel/entry.S:27
    #1  0xffffffff8004f202 in vprintk_default (fmt=fmt@entry=0xffffffff80d45cb8 "01c%lu.%02lu BogoMIPS (lpj=%lu)
    ", 
        args=args@entry=0xffffffff81203ea8) at kernel/printk/printk.c:2185
    #2  0xffffffff8004f7aa in vprintk (fmt=fmt@entry=0xffffffff80d45cb8 "01c%lu.%02lu BogoMIPS (lpj=%lu)
    ", 
        args=args@entry=0xffffffff81203ea8) at kernel/printk/printk_safe.c:392
    #3  0xffffffff806fccf6 in printk (fmt=fmt@entry=0xffffffff80d45cb8 "01c%lu.%02lu BogoMIPS (lpj=%lu)
    ")
        at kernel/printk/printk.c:2216
    #4  0xffffffff800027b8 in calibrate_delay () at init/calibrate.c:308
    #5  0xffffffff80800cfa in start_kernel () at init/main.c:1098
    #6  0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 2, handle_exception () at arch/riscv/kernel/entry.S:27
    27              csrrw tp, CSR_SCRATCH, tp
    (gdb) bt
    #0  handle_exception () at arch/riscv/kernel/entry.S:27
    #1  0xffffffff8004f0f6 in vprintk_emit (facility=facility@entry=0, level=<optimized out>, level@entry=-1, 
        dev_info=dev_info@entry=0x0, fmt=fmt@entry=0xffffffff80d45cb8 "01c%lu.%02lu BogoMIPS (lpj=%lu)
    ", 
        args=args@entry=0xffffffff81203ea8) at kernel/printk/printk.c:2158
    #2  0xffffffff8004f202 in vprintk_default (fmt=fmt@entry=0xffffffff80d45cb8 "01c%lu.%02lu BogoMIPS (lpj=%lu)
    ", 
        args=args@entry=0xffffffff81203ea8) at kernel/printk/printk.c:2185
    #3  0xffffffff8004f7aa in vprintk (fmt=fmt@entry=0xffffffff80d45cb8 "01c%lu.%02lu BogoMIPS (lpj=%lu)
    ", 
        args=args@entry=0xffffffff81203ea8) at kernel/printk/printk_safe.c:392
    #4  0xffffffff806fccf6 in printk (fmt=fmt@entry=0xffffffff80d45cb8 "01c%lu.%02lu BogoMIPS (lpj=%lu)
    ")
        at kernel/printk/printk.c:2216
    #5  0xffffffff800027b8 in calibrate_delay () at init/calibrate.c:308
    #6  0xffffffff80800cfa in start_kernel () at init/main.c:1098
    #7  0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) 

    sifive_console_init

    [root@centos7 linux-5.14.g]#  riscv64-unknown-elf-gdb    vmlinux
    GNU gdb (GDB) 11.1
    Copyright (C) 2021 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    Type "show copying" and "show warranty" for details.
    This GDB was configured as "--host=aarch64-unknown-linux-gnu --target=riscv64-unknown-elf".
    Type "show configuration" for configuration details.
    For bug reporting instructions, please see:
    <https://www.gnu.org/software/gdb/bugs/>.
    Find the GDB manual and other documentation resources online at:
        <http://www.gnu.org/software/gdb/documentation/>.
    
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from vmlinux...
    (gdb) target remote:1234
    Remote debugging using :1234
    warning: Can not parse XML target description; XML support was disabled at compile time
    0x0000000000001000 in ?? ()
    (gdb) b  try_enable_new_console
    Breakpoint 1 at 0xffffffff8004d000: file kernel/printk/printk.c, line 2809.
    (gdb) c
    Continuing.
    
    Breakpoint 1, try_enable_new_console (newcon=newcon@entry=0xffffffff81299c28 <early_con>, user_specified=user_specified@entry=true) at kernel/printk/printk.c:2809
    2809                 i < MAX_CMDLINECONSOLES && c->name[0];
    (gdb) list
    2804    {
    2805            struct console_cmdline *c;
    2806            int i, err;
    2807
    2808            for (i = 0, c = console_cmdline;
    2809                 i < MAX_CMDLINECONSOLES && c->name[0];
    2810                 i++, c++) {
    2811                    if (c->user_specified != user_specified)
    2812                            continue;
    2813                    if (!newcon->match ||
    (gdb) set print pretty on
    (gdb) p *c
    $1 = {
      name = '00' <repeats 15 times>,
      index = 0,
      user_specified = false,
      options = 0x0
    }
    (gdb) b sifive_console_init
    Breakpoint 2 at 0xffffffff8081a1ca: file drivers/tty/serial/sifive.c, line 877.
    (gdb) c
    Continuing.
    
    Breakpoint 1, try_enable_new_console (newcon=newcon@entry=0xffffffff81299c28 <early_con>, user_specified=user_specified@entry=false) at kernel/printk/printk.c:2809
    2809                 i < MAX_CMDLINECONSOLES && c->name[0];
    (gdb) p *c
    $2 = {
      name = '00' <repeats 15 times>,
      index = 0,
      user_specified = false,
      options = 0x0
    }
    (gdb) c
    Continuing.
    
    Breakpoint 1, try_enable_new_console (newcon=newcon@entry=0xffffffff81296ae8 <vt_console_driver>, user_specified=user_specified@entry=true) at kernel/printk/printk.c:2809
    2809                 i < MAX_CMDLINECONSOLES && c->name[0];
    (gdb) c
    Continuing.
    
    Breakpoint 1, try_enable_new_console (newcon=newcon@entry=0xffffffff81296ae8 <vt_console_driver>, user_specified=user_specified@entry=false) at kernel/printk/printk.c:2809
    2809                 i < MAX_CMDLINECONSOLES && c->name[0];
    (gdb) c
    Continuing.
    
    Breakpoint 1, try_enable_new_console (newcon=newcon@entry=0xffffffff812996c0 <hvc_console>, user_specified=user_specified@entry=true) at kernel/printk/printk.c:2809
    2809                 i < MAX_CMDLINECONSOLES && c->name[0];
    (gdb) c
    Continuing.
    
    Breakpoint 1, try_enable_new_console (newcon=newcon@entry=0xffffffff812996c0 <hvc_console>, user_specified=user_specified@entry=false) at kernel/printk/printk.c:2809
    2809                 i < MAX_CMDLINECONSOLES && c->name[0];
    (gdb) c
    Continuing.
    
    Breakpoint 1, try_enable_new_console (newcon=newcon@entry=0xffffffff81299c88 <univ8250_console>, user_specified=user_specified@entry=true) at kernel/printk/printk.c:2809
    2809                 i < MAX_CMDLINECONSOLES && c->name[0];
    (gdb) c
    Continuing.
    
    Breakpoint 2, sifive_console_init () at drivers/tty/serial/sifive.c:877
    877             register_console(&sifive_serial_console);
    (gdb) bt
    #0  sifive_console_init () at drivers/tty/serial/sifive.c:877
    #1  0xffffffff80807a30 in console_init () at kernel/printk/printk.c:3091
    #2  0xffffffff80800bf0 in start_kernel () at init/main.c:1061
    #3  0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) list
    872             .data           = &sifive_serial_uart_driver,
    873     };
    874
    875     static int __init sifive_console_init(void)
    876     {
    877             register_console(&sifive_serial_console);
    878             return 0;
    879     }
    880
    881     console_initcall(sifive_console_init);
    (gdb) p sifive_serial_console)
    Junk after end of expression.
    (gdb) p *sifive_serial_console)
    Junk after end of expression.
    (gdb) c
    Continuing.
    
    Breakpoint 1, try_enable_new_console (newcon=newcon@entry=0xffffffff8129bf78 <sifive_serial_console>, user_specified=user_specified@entry=true) at kernel/printk/printk.c:2809
    2809                 i < MAX_CMDLINECONSOLES && c->name[0];
    (gdb) c
    Continuing.
    
    Breakpoint 1, try_enable_new_console (newcon=newcon@entry=0xffffffff8129bf78 <sifive_serial_console>, user_specified=user_specified@entry=false) at kernel/printk/printk.c:2809
    2809                 i < MAX_CMDLINECONSOLES && c->name[0];
    (gdb) c
    Continuing.
    
    Breakpoint 1, try_enable_new_console (newcon=newcon@entry=0xffffffff81299c88 <univ8250_console>, user_specified=user_specified@entry=true) at kernel/printk/printk.c:2809
    2809                 i < MAX_CMDLINECONSOLES && c->name[0];
    (gdb) 

    中断处理

    [root@centos7 linux-5.14.g]#  riscv64-unknown-elf-gdb    vmlinux
    GNU gdb (GDB) 11.1
    Copyright (C) 2021 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    Type "show copying" and "show warranty" for details.
    This GDB was configured as "--host=aarch64-unknown-linux-gnu --target=riscv64-unknown-elf".
    Type "show configuration" for configuration details.
    For bug reporting instructions, please see:
    <https://www.gnu.org/software/gdb/bugs/>.
    Find the GDB manual and other documentation resources online at:
        <http://www.gnu.org/software/gdb/documentation/>.
    
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from vmlinux...
    (gdb) target remote:1234
    Remote debugging using :1234
    warning: Can not parse XML target description; XML support was disabled at compile time
    0x0000000000001000 in ?? ()
    (gdb) b generic_handle_irq_desc
    Breakpoint 1 at 0xffffffff80050cc8: generic_handle_irq_desc. (5 locations)
    (gdb) c
    Continuing.
    
    Breakpoint 1, 0xffffffff800514d6 in generic_handle_irq_desc (desc=<optimized out>) at ./include/linux/irqdesc.h:158
    158             desc->handle_irq(desc);
    (gdb) bt
    #0  0xffffffff800514d6 in generic_handle_irq_desc (desc=<optimized out>) at ./include/linux/irqdesc.h:158
    #1  handle_irq_desc (desc=0xffffffe00160f400) at kernel/irq/irqdesc.c:646
    #2  handle_domain_irq (domain=0xffffffe00160c400, hwirq=<optimized out>, regs=<optimized out>)
        at kernel/irq/irqdesc.c:701
    #3  0xffffffff802e4136 in riscv_intc_irq (regs=<optimized out>) at drivers/irqchip/irq-riscv-intc.c:42
    #4  0xffffffff80003010 in handle_exception () at arch/riscv/kernel/entry.S:232
    Backtrace stopped: frame did not save the PC
    (gdb) b __handle_irq_event_percpu
    Breakpoint 2 at 0xffffffff80051b22: file kernel/irq/handle.c, line 140.
    (gdb) c
    Continuing.
    
    Breakpoint 1, 0xffffffff800514d6 in generic_handle_irq_desc (desc=<optimized out>) at ./include/linux/irqdesc.h:158
    158             desc->handle_irq(desc);
    (gdb) bt
    #0  0xffffffff800514d6 in generic_handle_irq_desc (desc=<optimized out>) at ./include/linux/irqdesc.h:158
    #1  handle_irq_desc (desc=0xffffffe00160f400) at kernel/irq/irqdesc.c:646
    #2  handle_domain_irq (domain=0xffffffe00160c400, hwirq=<optimized out>, regs=<optimized out>)
        at kernel/irq/irqdesc.c:701
    #3  0xffffffff802e4136 in riscv_intc_irq (regs=<optimized out>) at drivers/irqchip/irq-riscv-intc.c:42
    #4  0xffffffff80003010 in handle_exception () at arch/riscv/kernel/entry.S:232
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 1, 0xffffffff800514d6 in generic_handle_irq_desc (desc=<optimized out>) at ./include/linux/irqdesc.h:158
    158             desc->handle_irq(desc);
    (gdb) c
    Continuing.
    
    Breakpoint 1, 0xffffffff800514d6 in generic_handle_irq_desc (desc=<optimized out>) at ./include/linux/irqdesc.h:158
    158             desc->handle_irq(desc);
    (gdb) c
    Continuing.
    
    Breakpoint 1, 0xffffffff800514d6 in generic_handle_irq_desc (desc=<optimized out>) at ./include/linux/irqdesc.h:158
    158             desc->handle_irq(desc);
    (gdb) c
    Continuing.
    
    Breakpoint 1, 0xffffffff800514d6 in generic_handle_irq_desc (desc=<optimized out>) at ./include/linux/irqdesc.h:158
    158             desc->handle_irq(desc);
    (gdb) c
    Continuing.
    
    Breakpoint 1, 0xffffffff800514d6 in generic_handle_irq_desc (desc=<optimized out>) at ./include/linux/irqdesc.h:158
    158             desc->handle_irq(desc)
    (gdb) bt
    #0  __handle_irq_event_percpu (desc=desc@entry=0xffffffe001743600, flags=flags@entry=0xffffffd0040db984)
        at kernel/irq/handle.c:140
    #1  0xffffffff80051cea in handle_irq_event_percpu (desc=0xffffffe001743600) at kernel/irq/handle.c:196
    #2  handle_irq_event (desc=desc@entry=0xffffffe001743600) at kernel/irq/handle.c:213
    #3  0xffffffff80055494 in handle_fasteoi_irq (desc=<optimized out>) at kernel/irq/chip.c:717
    #4  0xffffffff80051154 in generic_handle_irq_desc (desc=<optimized out>) at ./include/linux/irqdesc.h:158
    #5  handle_irq_desc (desc=<optimized out>) at kernel/irq/irqdesc.c:646
    #6  generic_handle_domain_irq (domain=<optimized out>, hwirq=<optimized out>) at kernel/irq/irqdesc.c:675
    #7  0xffffffff802e4336 in plic_handle_irq (desc=0xffffffe00160f200) at drivers/irqchip/irq-sifive-plic.c:238
    #8  0xffffffff800514de in generic_handle_irq_desc (desc=<optimized out>) at ./include/linux/irqdesc.h:158
    #9  handle_irq_desc (desc=<optimized out>) at kernel/irq/irqdesc.c:646
    #10 handle_domain_irq (domain=<optimized out>, hwirq=<optimized out>, regs=<optimized out>) at kernel/irq/irqdesc.c:701
    #11 0xffffffff802e4136 in riscv_intc_irq (regs=<optimized out>) at drivers/irqchip/irq-riscv-intc.c:42
    #12 0xffffffff80003010 in handle_exception () at arch/riscv/kernel/entry.S:232
    Backtrace stopped: frame did not save the PC
    (gdb) c

     时钟

     时钟初始化


    error = cpuhp_setup_state(CPUHP_AP_RISCV_TIMER_STARTING,
    "clockevents/riscv/timer:starting",
    riscv_timer_starting_cpu, riscv_timer_dying_cpu)

    [root@centos7 linux-5.14.g]#  riscv64-unknown-elf-gdb    vmlinux
    GNU gdb (GDB) 11.1
    Copyright (C) 2021 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    Type "show copying" and "show warranty" for details.
    This GDB was configured as "--host=aarch64-unknown-linux-gnu --target=riscv64-unknown-elf".
    Type "show configuration" for configura 
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from vmlinux...
    (gdb) target remote:1234
    Remote debugging using :1234
    warning: Can not parse XML target description; XML support was disabled at compile time
    0x0000000000001000 in ?? ()
    (gdb) b clockevents_config_and_register
    Breakpoint 1 at 0xffffffff800721c2: file kernel/time/clockevents.c, line 507.
    (gdb) b  setup_irq
    Function "setup_irq" not defined.
    Make breakpoint pending on future shared library load? (y or [n]) n
    (gdb) b  update_process_times
    Breakpoint 2 at 0xffffffff80067600: file kernel/time/timer.c, line 1780.
    (gdb) c
    Continuing.
    
    Breakpoint 1, clockevents_config_and_register (dev=0xffffffe03efeb8c0, freq=10000000, min_delta=min_delta@entry=100, max_delta=max_delta@entry=2147483647) at kernel/time/clockevents.c:507
    507     {
    (gdb) bt
    #0  clockevents_config_and_register (dev=0xffffffe03efeb8c0, freq=10000000, min_delta=min_delta@entry=100, 
        max_delta=max_delta@entry=2147483647) at kernel/time/clockevents.c:507
    #1  0xffffffff805a2f16 in riscv_timer_starting_cpu (cpu=<optimized out>) at drivers/clocksource/timer-riscv.c:72
    #2  0xffffffff8000bcae in cpuhp_invoke_callback (cpu=<optimized out>, state=<optimized out>, 
        bringup=bringup@entry=true, node=<optimized out>, lastp=lastp@entry=0x0) at kernel/cpu.c:180
    #3  0xffffffff8000caea in cpuhp_issue_call (node=<optimized out>, bringup=true, state=<optimized out>, 
        cpu=<optimized out>) at kernel/cpu.c:1887
    #4  cpuhp_issue_call (cpu=<optimized out>, state=<optimized out>, bringup=<optimized out>, node=<optimized out>)
        at kernel/cpu.c:1867
    #5  0xffffffff8000ce6e in __cpuhp_setup_state_cpuslocked (state=<optimized out>, 
        state@entry=CPUHP_AP_RISCV_TIMER_STARTING, name=name@entry=0xffffffff80dc3c98 "clockevents/riscv/timer:starting", 
        invoke=invoke@entry=true, startup=startup@entry=0xffffffff805a2eaa <riscv_timer_starting_cpu>, 
        teardown=teardown@entry=0xffffffff805a2e88 <riscv_timer_dying_cpu>, multi_instance=multi_instance@entry=false)
        at kernel/cpu.c:2032
    #6  0xffffffff8000d00a in __cpuhp_setup_state (state=state@entry=CPUHP_AP_RISCV_TIMER_STARTING, 
        name=name@entry=0xffffffff80dc3c98 "clockevents/riscv/timer:starting", invoke=invoke@entry=true, 
        startup=startup@entry=0xffffffff805a2eaa <riscv_timer_starting_cpu>, 
        teardown=teardown@entry=0xffffffff805a2e88 <riscv_timer_dying_cpu>, multi_instance=multi_instance@entry=false)
        at kernel/cpu.c:2061
    #7  0xffffffff8082069c in cpuhp_setup_state (teardown=<optimized out>, startup=<optimized out>, 
        name=0xffffffff80dc3c98 "clockevents/riscv/timer:starting", state=CPUHP_AP_RISCV_TIMER_STARTING)
        at ./include/linux/cpuhotplug.h:231
    --Type <RET> for more, q to quit, c to continue without paging--
    #8  riscv_timer_init_dt (n=<optimized out>) at drivers/clocksource/timer-riscv.c:157
    #9  0xffffffff808203fa in timer_probe () at drivers/clocksource/timer-probe.c:30
    #10 0xffffffff808031f6 in time_init () at arch/riscv/kernel/time.c:31
    #11 0xffffffff80800b82 in start_kernel () at init/main.c:1041
    #12 0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 2, update_process_times (user_tick=0) at kernel/time/timer.c:1780
    1780            PRANDOM_ADD_NOISE(jiffies, user_tick, p, 0);
    (gdb) bt
    #0  update_process_times (user_tick=0) at kernel/time/timer.c:1780
    #1  0xffffffff8007294c in tick_periodic (cpu=cpu@entry=0) at kernel/time/tick-common.c:100
    #2  0xffffffff800729d4 in tick_handle_periodic (dev=0xffffffe03efeb8c0) at kernel/time/tick-common.c:112
    #3  0xffffffff805a2e7e in riscv_timer_interrupt (irq=<optimized out>, dev_id=<optimized out>)
        at drivers/clocksource/timer-riscv.c:92
    #4  0xffffffff800560da in handle_percpu_devid_irq (desc=<optimized out>) at ./arch/riscv/include/asm/current.h:31
    #5  0xffffffff800514de in generic_handle_irq_desc (desc=<optimized out>) at ./include/linux/irqdesc.h:158
    #6  handle_irq_desc (desc=<optimized out>) at kernel/irq/irqdesc.c:646
    #7  handle_domain_irq (domain=<optimized out>, hwirq=<optimized out>, regs=<optimized out>) at kernel/irq/irqdesc.c:701
    #8  0xffffffff802e4136 in riscv_intc_irq (regs=<optimized out>) at drivers/irqchip/irq-riscv-intc.c:42
    #9  0xffffffff80003010 in handle_exception () at arch/riscv/kernel/entry.S:232
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 2, update_process_times (user_tick=0) at kernel/time/timer.c:1780
    1780            PRANDOM_ADD_NOISE(jiffies, user_tick, p, 0);
    (gdb) bt
    #0  update_process_times (user_tick=0) at kernel/time/timer.c:1780
    #1  0xffffffff8007294c in tick_periodic (cpu=cpu@entry=0) at kernel/time/tick-common.c:100
    #2  0xffffffff800729d4 in tick_handle_periodic (dev=0xffffffe03efeb8c0) at kernel/time/tick-common.c:112
    #3  0xffffffff805a2e7e in riscv_timer_interrupt (irq=<optimized out>, dev_id=<optimized out>)
        at drivers/clocksource/timer-riscv.c:92
    #4  0xffffffff800560da in handle_percpu_devid_irq (desc=<optimized out>) at ./arch/riscv/include/asm/current.h:31
    #5  0xffffffff800514de in generic_handle_irq_desc (desc=<optimized out>) at ./include/linux/irqdesc.h:158
    #6  handle_irq_desc (desc=<optimized out>) at kernel/irq/irqdesc.c:646
    #7  handle_domain_irq (domain=<optimized out>, hwirq=<optimized out>, regs=<optimized out>) at kernel/irq/irqdesc.c:701
    #8  0xffffffff802e4136 in riscv_intc_irq (regs=<optimized out>) at drivers/irqchip/irq-riscv-intc.c:42
    #9  0xffffffff80003010 in handle_exception () at arch/riscv/kernel/entry.S:232
    Backtrace stopped: frame did not save the PC
    (gdb) info breaks
    Undefined info command: "breaks".  Try "help info".
    (gdb) info break
    Num     Type           Disp Enb Address            What
    1       breakpoint     keep y   0xffffffff800721c2 in clockevents_config_and_register at kernel/time/clockevents.c:507
            breakpoint already hit 1 time
    2       breakpoint     keep y   0xffffffff80067600 in update_process_times at kernel/time/timer.c:1780
            breakpoint already hit 2 times
    (gdb) delete 1
    (gdb) delete 2
    (gdb) c
    Continuing.

    timer_probe(void)

    Linux 时钟框架学习笔记

    #define TIMER_OF_DECLARE(name, compat, fn) 
            OF_DECLARE_1_RET(timer, name, compat, fn)
    #define OF_DECLARE_1(table, name, compat, fn) 
                    _OF_DECLARE(table, name, compat, fn, of_init_fn_1)
    #define OF_DECLARE_1_RET(table, name, compat, fn) 
                    _OF_DECLARE(table, name, compat, fn, of_init_fn_1_ret)
    #define OF_DECLARE_2(table, name, compat, fn) 
                    _OF_DECLARE(table, name, compat, fn, of_init_fn_2)
    static int __init arm_sp804_of_init(struct device_node *np)
    {
        return sp804_of_init(np, &arm_sp804_timer);
    }
    TIMER_OF_DECLARE(sp804, "arm,sp804", arm_sp804_of_init);
    
    static int __init hisi_sp804_of_init(struct device_node *np)
    {
        return sp804_of_init(np, &hisi_sp804_timer);
    }
    TIMER_OF_DECLARE(hisi_sp804, "hisilicon,sp804", hisi_sp804_of_init);
        timer0: timer@20020000 {
                compatible = "arm,sp804", "arm,primecell";
                 
            };
    void __init timer_probe(void)
    {
            struct device_node *np;
            const struct of_device_id *match;
            of_init_fn_1_ret init_func_ret;
            unsigned timers = 0;
            int ret;
    
            for_each_matching_node_and_match(np, __timer_of_table, &match) {
                    if (!of_device_is_available(np))
                            continue;
    
                    init_func_ret = match->data;
    
                    ret = init_func_ret(np);
                    if (ret) {
                            if (ret != -EPROBE_DEFER)
                                    pr_err("Failed to initialize '%pOF': %d
    ", np,
                                           ret);
                            continue;
                    }
    
                    timers++;
            }
    
            timers += acpi_probe_device_table(timer);
    
            if (!timers)
                    pr_crit("%s: no matching timers found
    ", __func__);
    }

     TIMER_OF_DECLARE(riscv_timer, "riscv", riscv_timer_init_dt);

    drivers/clocksource/timer-riscv.c:166:TIMER_OF_DECLARE(riscv_timer, "riscv", riscv_timer_init_dt);
    drivers/clocksource/timer-clint.c:243:TIMER_OF_DECLARE(clint_timer, "riscv,clint0", clint_timer_init_dt);

    (gdb) target remote:1234
    Remote debugging using :1234
    warning: Can not parse XML target description; XML support was disabled at compile time
    0x0000000000001000 in ?? ()
    (gdb) b timer_probe
    Breakpoint 1 at 0xffffffff80820398: file drivers/clocksource/timer-probe.c, line 17.
    (gdb) c
    Continuing.
    
    Breakpoint 1, timer_probe () at drivers/clocksource/timer-probe.c:17
    17      {
    (gdb) s
    24              for_each_matching_node_and_match(np, __timer_of_table, &match) {
    (gdb) p __timer_of_tabl
    No symbol "__timer_of_tabl" in current context.
    (gdb) p __timer_of_table
    $1 = 0xffffffff80a0e6d0 <__of_table_riscv_timer>
    (gdb) p *__timer_of_table
    $2 = {name = '00' <repeats 31 times>, type = '00' <repeats 31 times>, compatible = "riscv", '00' <repeats 122 times>, data = 0xffffffff8082049c <riscv_timer_init_dt>}
    (gdb) set print pretty on
    (gdb) p *__timer_of_table
    $3 = {
      name = '00' <repeats 31 times>,
      type = '00' <repeats 31 times>,
      compatible = "riscv", '00' <repeats 122 times>,
      data = 0xffffffff8082049c <riscv_timer_init_dt>
    }
    (gdb) n
    25                      if (!of_device_is_available(np))
    (gdb) p *np
    $4 = {
      name = 0xffffffe03fdfcbb0 "cpu",
      phandle = 1,
      full_name = 0xffffffe03fdfc8a8 "cpu@0",
      fwnode = {
        secondary = 0x0,
        ops = 0xffffffff80cac4a0 <of_fwnode_ops>,
        dev = 0x0,
        suppliers = {
          next = 0xffffffe03fdfc808,
          prev = 0xffffffe03fdfc808
        },
        consumers = {
          next = 0xffffffe03fdfc818,
          prev = 0xffffffe03fdfc818
        },
        flags = 0 '00'
      },
      properties = 0xffffffe03fdfc8b0,
      deadprops = 0x0,
      parent = 0xffffffe03fdfc148,
      child = 0xffffffe03fdfcbb8,
      sibling = 0x0,
      kobj = {
        name = 0x0,
        entry = {
          next = 0xffffffe03fdfc860,
          prev = 0xffffffe03fdfc860
        },
        parent = 0x0,
        kset = 0x0,
        ktype = 0xffffffff812bdd28 <of_node_ktype>,
        sd = 0x0,
        kref = {
          refcount = {
            refs = {
              counter = 1
            }
          }
        },
        state_initialized = 1,
        state_in_sysfs = 0,
        state_add_uevent_sent = 0,
        state_remove_uevent_sent = 0,
        uevent_suppress = 0
      },
      _flags = 0,
      data = 0x0
    }
    (gdb) p *match
    $5 = {
      name = '00' <repeats 31 times>,
      type = '00' <repeats 31 times>,
      compatible = "riscv", '00' <repeats 122 times>,
      data = 0xffffffff8082049c <riscv_timer_init_dt>
    }
    (gdb) c
    Continuing.

    timer_of_table

    [root@centos7 linux-5.14.g]# grep __timer_of_table -rn *
    arch/riscv/kernel/vmlinux.lds:65: .init.data : AT(ADDR(.init.data) - ((((-1))) - 0x80000000 + 1)) { KEEP(*(SORT(___kentry+*))) *(.init.data init.data.*) *(.meminit.data*) *(.init.rodata .init.rodata.*) *(.meminit.rodata) . = ALIGN(8); __clk_of_table = .; KEEP(*(__clk_of_table)) KEEP(*(__clk_of_table_end)) . = ALIGN(8); __reservedmem_of_table = .; KEEP(*(__reservedmem_of_table)) KEEP(*(__reservedmem_of_table_end)) . = ALIGN(8); __timer_of_table = .; KEEP(*(__timer_of_table)) KEEP(*(__timer_of_table_end)) . = ALIGN(8); __cpu_method_of_table = .; KEEP(*(__cpu_method_of_table)) KEEP(*(__cpu_method_of_table_end)) . = ALIGN(32); __dtb_start = .; KEEP(*(.dtb.init.rodata)) __dtb_end = .; . = ALIGN(8); __irqchip_of_table = .; KEEP(*(__irqchip_of_table)) KEEP(*(__irqchip_of_table_end)) . = ALIGN(8); __earlycon_table = .; KEEP(*(__earlycon_table)) __earlycon_table_end = .; . = ALIGN(8); __kunit_suites_start = .; KEEP(*(.kunit_test_suites)) __kunit_suites_end = .; . = ALIGN(16); __setup_start = .; KEEP(*(.init.setup)) __setup_end = .; __initcall_start = .; KEEP(*(.initcallearly.init)) __initcall0_start = .; KEEP(*(.initcall0.init)) KEEP(*(.initcall0s.init)) __initcall1_start = .; KEEP(*(.initcall1.init)) KEEP(*(.initcall1s.init)) __initcall2_start = .; KEEP(*(.initcall2.init)) KEEP(*(.initcall2s.init)) __initcall3_start = .; KEEP(*(.initcall3.init)) KEEP(*(.initcall3s.init)) __initcall4_start = .; KEEP(*(.initcall4.init)) KEEP(*(.initcall4s.init)) __initcall5_start = .; KEEP(*(.initcall5.init)) KEEP(*(.initcall5s.init)) __initcallrootfs_start = .; KEEP(*(.initcallrootfs.init)) KEEP(*(.initcallrootfss.init)) __initcall6_start = .; KEEP(*(.initcall6.init)) KEEP(*(.initcall6s.init)) __initcall7_start = .; KEEP(*(.initcall7.init)) KEEP(*(.initcall7s.init)) __initcall_end = .; __con_initcall_start = .; KEEP(*(.con_initcall.init)) __con_initcall_end = .; . = ALIGN(4); __initramfs_start = .; KEEP(*(.init.ramfs)) . = ALIGN(8); KEEP(*(.init.ramfs.info)) }
    drivers/clocksource/timer-probe.c:11:extern struct of_device_id __timer_of_table[];
    drivers/clocksource/timer-probe.c:13:static const struct of_device_id __timer_of_table_sentinel
    drivers/clocksource/timer-probe.c:14:   __used __section("__timer_of_table_end");
    drivers/clocksource/timer-probe.c:24:   for_each_matching_node_and_match(np, __timer_of_table, &match) {
    Binary file drivers/clocksource/timer-probe.o matches
    Binary file drivers/clocksource/timer-riscv.o matches
    linux-dr:1191212:                       128c4: R_RISCV_PCREL_HI20       __timer_of_table
    linux-dr:1191236:                       128e6: R_RISCV_PCREL_HI20       __timer_of_table
    System.map:44626:ffffffff80a0e6d0 D __timer_of_table
    System.map:44627:ffffffff80a0e798 d __timer_of_table_sentinel

    tick_set_periodic_handler

    tick_set_periodic_handler
    
    
    /*
     * Set the periodic handler depending on broadcast on/off
     */
    void tick_set_periodic_handler(struct clock_event_device *dev, int broadcast)
    {
            if (!broadcast)
                    dev->event_handler = tick_handle_periodic;
            else
                    dev->event_handler = tick_handle_periodic_broadcast;
    }
    
    
    [root@centos7 linux-5.14.g]#  riscv64-unknown-elf-gdb    vmlinux
    GNU gdb (GDB) 11.1
    Copyright (C) 2021 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    Type "show copying" and "show warranty" for details.
    This GDB was configured as "--host=aarch64-unknown-linux-gnu --target=riscv64-unknown-elf".
    Type "show configuration" for configuration details.
    For bug reporting instructions, please see:
    <https://www.gnu.org/software/gdb/bugs/>.
    Find the GDB manual and other documentation resources online at:
        <http://www.gnu.org/software/gdb/documentation/>.
    
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from vmlinux...
    (gdb) target remote:1234
    Remote debugging using :1234
    warning: Can not parse XML target description; XML support was disabled at compile time
    0x0000000000001000 in ?? ()
    (gdb) b tick_set_periodic_handler
    Breakpoint 1 at 0xffffffff80073d42: file kernel/time/tick-broadcast.c, line 516.
    (gdb) c
    Continuing.
    
    Breakpoint 1, tick_set_periodic_handler (dev=dev@entry=0xffffffe03efeb8c0, broadcast=0) at kernel/time/tick-broadcast.c:516
    516             if (!broadcast)
    (gdb) bt
    #0  tick_set_periodic_handler (dev=dev@entry=0xffffffe03efeb8c0, broadcast=0) at kernel/time/tick-broadcast.c:516
    #1  0xffffffff80072ade in tick_setup_periodic (dev=0xffffffe03efeb8c0, broadcast=<optimized out>)
        at kernel/time/tick-common.c:154
    #2  0xffffffff80072bc0 in tick_setup_device (td=td@entry=0xffffffe03efea068, newdev=newdev@entry=0xffffffe03efeb8c0, 
        cpu=cpu@entry=0, cpumask=<optimized out>) at kernel/time/tick-common.c:272
    #3  0xffffffff80072e3a in tick_check_new_device (newdev=newdev@entry=0xffffffe03efeb8c0)
        at kernel/time/tick-common.c:367
    #4  0xffffffff800720c8 in clockevents_register_device (dev=dev@entry=0xffffffe03efeb8c0)
        at kernel/time/clockevents.c:464
    #5  0xffffffff800721e2 in clockevents_config_and_register (dev=0xffffffe03efeb8c0, freq=<optimized out>, 
        min_delta=min_delta@entry=100, max_delta=max_delta@entry=2147483647) at kernel/time/clockevents.c:511
    #6  0xffffffff805a2f16 in riscv_timer_starting_cpu (cpu=<optimized out>) at drivers/clocksource/timer-riscv.c:72
    #7  0xffffffff8000bcae in cpuhp_invoke_callback (cpu=<optimized out>, state=<optimized out>, 
        bringup=bringup@entry=true, node=<optimized out>, lastp=lastp@entry=0x0) at kernel/cpu.c:180
    #8  0xffffffff8000caea in cpuhp_issue_call (node=<optimized out>, bringup=true, state=<optimized out>, 
        cpu=<optimized out>) at kernel/cpu.c:1887
    #9  cpuhp_issue_call (cpu=<optimized out>, state=<optimized out>, bringup=<optimized out>, node=<optimized out>)
        at kernel/cpu.c:1867
    #10 0xffffffff8000ce6e in __cpuhp_setup_state_cpuslocked (state=<optimized out>, 
        state@entry=CPUHP_AP_RISCV_TIMER_STARTING, name=name@entry=0xffffffff80dc3c98 "clockevents/riscv/timer:starting", 
        invoke=invoke@entry=true, startup=startup@entry=0xffffffff805a2eaa <riscv_timer_starting_cpu>, 
        teardown=teardown@entry=0xffffffff805a2e88 <riscv_timer_dying_cpu>, multi_instance=multi_instance@entry=false)
    --Type <RET> for more, q to quit, c to continue without paging--
        at kernel/cpu.c:2032
    #11 0xffffffff8000d00a in __cpuhp_setup_state (state=state@entry=CPUHP_AP_RISCV_TIMER_STARTING, 
        name=name@entry=0xffffffff80dc3c98 "clockevents/riscv/timer:starting", invoke=invoke@entry=true, 
        startup=startup@entry=0xffffffff805a2eaa <riscv_timer_starting_cpu>, 
        teardown=teardown@entry=0xffffffff805a2e88 <riscv_timer_dying_cpu>, multi_instance=multi_instance@entry=false)
        at kernel/cpu.c:2061
    #12 0xffffffff8082069c in cpuhp_setup_state (teardown=<optimized out>, startup=<optimized out>, 
        name=0xffffffff80dc3c98 "clockevents/riscv/timer:starting", state=CPUHP_AP_RISCV_TIMER_STARTING)
        at ./include/linux/cpuhotplug.h:231
    #13 riscv_timer_init_dt (n=<optimized out>) at drivers/clocksource/timer-riscv.c:157
    #14 0xffffffff808203fa in timer_probe () at drivers/clocksource/timer-probe.c:30
    #15 0xffffffff808031f6 in time_init () at arch/riscv/kernel/time.c:31
    #16 0xffffffff80800b82 in start_kernel () at init/main.c:1041
    #17 0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) s
    tick_setup_periodic (dev=0xffffffe03efeb8c0, broadcast=<optimized out>) at kernel/time/tick-common.c:157
    157             if (!tick_device_is_functional(dev))
    (gdb) list
    152     void tick_setup_periodic(struct clock_event_device *dev, int broadcast)
    153     {
    154             tick_set_periodic_handler(dev, broadcast);
    155
    156             /* Broadcast setup ? */
    157             if (!tick_device_is_functional(dev))
    158                     return;
    159
    160             if ((dev->features & CLOCK_EVT_FEAT_PERIODIC) &&
    161                 !tick_broadcast_oneshot_active()) {
    (gdb) n
    160             if ((dev->features & CLOCK_EVT_FEAT_PERIODIC) &&
    (gdb) n
    152     void tick_setup_periodic(struct clock_event_device *dev, int broadcast)
    (gdb) bt
    #0  tick_setup_periodic (dev=0xffffffe03efeb8c0, broadcast=<optimized out>) at kernel/time/tick-common.c:152
    #1  0xffffffff80072bc0 in tick_setup_device (td=td@entry=0xffffffe03efea068, newdev=newdev@entry=0xffffffe03efeb8c0, 
        cpu=cpu@entry=0, cpumask=<optimized out>) at kernel/time/tick-common.c:272
    #2  0xffffffff80072e3a in tick_check_new_device (newdev=newdev@entry=0xffffffe03efeb8c0)
        at kernel/time/tick-common.c:367
    #3  0xffffffff800720c8 in clockevents_register_device (dev=dev@entry=0xffffffe03efeb8c0)
        at kernel/time/clockevents.c:464
    #4  0xffffffff800721e2 in clockevents_config_and_register (dev=0xffffffe03efeb8c0, freq=<optimized out>, 
        min_delta=min_delta@entry=100, max_delta=max_delta@entry=2147483647) at kernel/time/clockevents.c:511
    #5  0xffffffff805a2f16 in riscv_timer_starting_cpu (cpu=<optimized out>) at drivers/clocksource/timer-riscv.c:72
    #6  0xffffffff8000bcae in cpuhp_invoke_callback (cpu=<optimized out>, state=<optimized out>, 
        bringup=bringup@entry=true, node=<optimized out>, lastp=lastp@entry=0x0) at kernel/cpu.c:180
    #7  0xffffffff8000caea in cpuhp_issue_call (node=<optimized out>, bringup=true, state=<optimized out>, 
        cpu=<optimized out>) at kernel/cpu.c:1887
    #8  cpuhp_issue_call (cpu=<optimized out>, state=<optimized out>, bringup=<optimized out>, node=<optimized out>)
        at kernel/cpu.c:1867
    #9  0xffffffff8000ce6e in __cpuhp_setup_state_cpuslocked (state=<optimized out>, 
        state@entry=CPUHP_AP_RISCV_TIMER_STARTING, name=name@entry=0xffffffff80dc3c98 "clockevents/riscv/timer:starting", 
        invoke=invoke@entry=true, startup=startup@entry=0xffffffff805a2eaa <riscv_timer_starting_cpu>, 
        teardown=teardown@entry=0xffffffff805a2e88 <riscv_timer_dying_cpu>, multi_instance=multi_instance@entry=false)
        at kernel/cpu.c:2032
    #10 0xffffffff8000d00a in __cpuhp_setup_state (state=state@entry=CPUHP_AP_RISCV_TIMER_STARTING, 
    --Type <RET> for more, q to quit, c to continue without paging--
        name=name@entry=0xffffffff80dc3c98 "clockevents/riscv/timer:starting", invoke=invoke@entry=true, 
        startup=startup@entry=0xffffffff805a2eaa <riscv_timer_starting_cpu>, 
        teardown=teardown@entry=0xffffffff805a2e88 <riscv_timer_dying_cpu>, multi_instance=multi_instance@entry=false)
        at kernel/cpu.c:2061
    #11 0xffffffff8082069c in cpuhp_setup_state (teardown=<optimized out>, startup=<optimized out>, 
        name=0xffffffff80dc3c98 "clockevents/riscv/timer:starting", state=CPUHP_AP_RISCV_TIMER_STARTING)
        at ./include/linux/cpuhotplug.h:231
    #12 riscv_timer_init_dt (n=<optimized out>) at drivers/clocksource/timer-riscv.c:157
    #13 0xffffffff808203fa in timer_probe () at drivers/clocksource/timer-probe.c:30
    #14 0xffffffff808031f6 in time_init () at arch/riscv/kernel/time.c:31
    #15 0xffffffff80800b82 in start_kernel () at init/main.c:1041
    #16 0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) s
    tick_setup_periodic (broadcast=<optimized out>, dev=<optimized out>) at kernel/time/tick-common.c:168
    168                             seq = read_seqcount_begin(&jiffies_seq);
    (gdb) list
    163             } else {
    164                     unsigned int seq;
    165                     ktime_t next;
    166
    167                     do {
    168                             seq = read_seqcount_begin(&jiffies_seq);
    169                             next = tick_next_period;
    170                     } while (read_seqcount_retry(&jiffies_seq, seq));
    171
    172                     clockevents_switch_state(dev, CLOCK_EVT_STATE_ONESHOT);
    (gdb) c
    Continuing.

     set_handle_irq(&riscv_intc_irq);

    set_handle_irq(&riscv_intc_irq);
    
    
    (gdb) target remote:1234
    Remote debugging using :1234
    warning: Can not parse XML target description; XML support was disabled at compile time
    0x0000000000001000 in ?? ()
    (gdb) b set_handle_irq
    Note: breakpoint 1 also set at pc 0xffffffff80807cee.
    Breakpoint 2 at 0xffffffff80807cee: file kernel/irq/handle.c, line 223.
    (gdb) c
    Continuing.
    
    Breakpoint 1, set_handle_irq (handle_irq=handle_irq@entry=0xffffffff802e4100 <riscv_intc_irq>) at kernel/irq/handle.c:223
    223             if (handle_arch_irq)
    (gdb) bt
    #0  set_handle_irq (handle_irq=handle_irq@entry=0xffffffff802e4100 <riscv_intc_irq>) at kernel/irq/handle.c:223
    #1  0xffffffff8081714a in riscv_intc_init (node=<optimized out>, parent=<optimized out>)
        at drivers/irqchip/irq-riscv-intc.c:124
    #2  0xffffffff80822178 in of_irq_init (matches=<optimized out>) at drivers/of/irq.c:540
    #3  0xffffffff808170ae in irqchip_init () at drivers/irqchip/irqchip.c:31
    #4  0xffffffff80802b0a in init_IRQ () at arch/riscv/kernel/irq.c:21
    #5  0xffffffff80800af6 in start_kernel () at init/main.c:1017
    #6  0xffffffff8000116a in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) 

    account_process_tick更新cpu统计信息。
    run_local_timers触发TIMER_SOFTIRQ软中断。
    scheduler_tick进行进程调度(在hrtimer激活的情况下,这个操作基本是空的)。

    void update_process_times(int user_tick)
    {
            struct task_struct *p = current;
            int cpu = smp_processor_id();
    
            /* Note: this timer irq context must be accounted for as well. */
            account_process_tick(p, user_tick);
            run_local_timers();
            rcu_check_callbacks(cpu, user_tick);
            printk_tick();
    #ifdef CONFIG_IRQ_WORK
            if (in_irq())
                    irq_work_run();
    #endif
            scheduler_tick();
            run_posix_cpu_timers(p);
    }
    void update_process_times(int user_tick)
    {
            struct task_struct *p = current;
            int cpu = smp_processor_id();
    
            /* Note: this timer irq context must be accounted for as well. */
            account_process_tick(p, user_tick);
            run_local_timers();
            rcu_check_callbacks(cpu, user_tick);
            printk_tick();
    #ifdef CONFIG_IRQ_WORK
            if (in_irq())
                    irq_work_run();
    #endif
            scheduler_tick();
            run_posix_cpu_timers(p);
    }



    到这里为止,cpu0的timer中断已经是准备好并且开始工作了。jiffies_64也在不断的增加了。
    大概只需要10来个jiffies(HZ=100)之后, local timer也参与到kernel中来了。

    sP804

    [root@centos7 clocksource]# grep 804 Kconfig 
    config ARM_TIMER_SP804
            bool "Support for Dual Timer SP804 module" if COMPILE_TEST
    [root@centos7 clocksource]# grep 804 Makefile 
    obj-$(CONFIG_ARM_TIMER_SP804)           += timer-sp804.o
    [root@centos7 clocksource]# cat ../../System.map  | grep sp804
    [root@centos7 clocksource]# grep CONFIG_ARM_TIMER_SP804 -rn *
    Makefile:66:obj-$(CONFIG_ARM_TIMER_SP804)               += timer-sp804.o
    [root@centos7 clocksource]# 
    [root@centos7 clocksource]# grep 804 Kconfig  -A 5
    config ARM_TIMER_SP804
            bool "Support for Dual Timer SP804 module" if COMPILE_TEST
            depends on GENERIC_SCHED_CLOCK && HAVE_CLK
            select CLKSRC_MMIO
            select TIMER_OF if OF
    
    config CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK

     

     drivers/clocksource/Kconfig

    config MICROCHIP_PIT64B
            bool "Microchip PIT64B support"
            depends on OF || COMPILE_TEST
            select CLKSRC_MMIO
            select TIMER_OF
            help
              This option enables Microchip PIT64B timer for Atmel
              based system. It supports the oneshot, the periodic
              modes and high resolution. It is used as a clocksource
              and a clockevent.

    grep PIT64B -rn *
    arch/arm/configs/at91_dt_defconfig:197:CONFIG_MICROCHIP_PIT64B=y

    arch/riscv/Kconfig添加

    menu "Clock Source drivers"
    choice
    config ARM_TIMER_SP804
            bool "Support for Dual Timer SP804 module" if COMPILE_TEST
            depends on GENERIC_SCHED_CLOCK && HAVE_CLK
            select CLKSRC_MMIO
            select TIMER_OF if OF
    
    
    endchoice
    endmenu

    竟然依赖COMPILE_TEST

    menu "Clock Source drivers*****"
    #choice
    
    config RISCV_TIMER_SP804
           bool "Support for Dual Timer SP804 module" 
           depends on GENERIC_SCHED_CLOCK && HAVE_CLK
           select CLKSRC_MMIO
           select TIMER_OF if OF
    
    
    #endchoice
    endmenu

    终于出来了

     

     第二种方法

    #menu "Clock Source drivers"
    ##choice
    #
    #config RISCV_TIMER_SP804
    #       bool "Support for Dual Timer SP804 module"
    #       depends on GENERIC_SCHED_CLOCK && HAVE_CLK
    #       select CLKSRC_MMIO
    #       select TIMER_OF if OF
    #
    #
    ##endchoice
    #endmenu
    source "arch/riscv/Kconfig.arm"
    [root@centos7 linux-5.14.g]# cat arch/riscv/Kconfig.arm
    
    menu "Clock Source drivers*****"
    #choice
    
    config ARM_TIMER_SP804
           #bool "Support for Dual Timer SP804 module" if COMPILE_TEST
           bool "Support for Dual Timer SP804 module"
           depends on GENERIC_SCHED_CLOCK && HAVE_CLK
           select CLKSRC_MMIO
           select TIMER_OF if OF
           
    
    #endchoice
    endmenu

     

    更改drivers/clocksource/Kconfig 

    [root@centos7 linux-5.14.g]# grep ARM_TIMER_SP804 .config
    CONFIG_ARM_TIMER_SP804=y
    [root@centos7 linux-5.14.g]# 
    [root@centos7 linux-5.14.g]# grep ARM_TIMER_SP804 .config
    CONFIG_ARM_TIMER_SP804=y
    [root@centos7 linux-5.14.g]# grep GENERIC_SCHED_CLOCK .config
    CONFIG_GENERIC_SCHED_CLOCK=y
    [root@centos7 linux-5.14.g]# grep HAVE_CLK  .config
    CONFIG_HAVE_CLK=y
    CONFIG_HAVE_CLK_PREPARE=y
    [root@centos7 linux-5.14.g]# 
    [root@centos7 linux-5.14.g]# make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu-  -j128
      SYNC    include/config/auto.conf.cmd
      HOSTCC  scripts/kconfig/conf.o
      HOSTLD  scripts/kconfig/conf
      CALL    scripts/atomic/check-atomics.sh
      CALL    scripts/checksyscalls.sh
      CHK     include/generated/compile.h
      CC      drivers/clocksource/mmio.o
      CC      drivers/clocksource/timer-sp804.o
      AR      drivers/clocksource/built-in.a
      AR      drivers/built-in.a
      GEN     .version
      CHK     include/generated/compile.h
      UPD     include/generated/compile.h
      CC      init/version.o
      AR      init/built-in.a
      LD      vmlinux.o
      MODPOST vmlinux.symvers
      MODINFO modules.builtin.modinfo
      GEN     modules.builtin
      LD      .tmp_vmlinux.kallsyms1
      KSYMS   .tmp_vmlinux.kallsyms1.S
      AS      .tmp_vmlinux.kallsyms1.S
      LD      .tmp_vmlinux.kallsyms2
      KSYMS   .tmp_vmlinux.kallsyms2.S
      AS      .tmp_vmlinux.kallsyms2.S
      LD      vmlinux
      SYSMAP  System.map
      OBJCOPY arch/riscv/boot/Image
      GZIP    arch/riscv/boot/Image.gz
      Kernel: arch/riscv/boot/Image.gz is ready
    [root@centos7 linux-5.14.g]# cat System.map  | grep hisi_sp804_of_init
    ffffffff8021440e t hisi_sp804_of_init
    [root@centos7 linux-5.14.g]# 
    # ls /s
    sbin/  sys/
    # ls /sys/bus/
    clockevents  gpio         mmc_rpmb     platform     serio        workqueue
    clocksource  hid          nvmem        rpmsg        spi
    container    i2c          pci          scsi         usb
    cpu          mmc          pci_express  sdio         virtio
    # 
    # ls /sys/bus/clocksource/
    devices            drivers_autoprobe  uevent
    drivers            drivers_probe
    # 
    # ls /sys/bus/clocksource/devices/
    clocksource0
    # 
    # ls /sys/bus/clocksource/devices/clocksource0/
    available_clocksource  subsystem              unbind_clocksource
    current_clocksource    uevent
    # 
    # cat  /sys/bus/clocksource/devices/clocksource0/available_clocksource 
    riscv_clocksource arm,sp804 
    # 
    struct clk_hw *of_clk_get_hw(struct device_node *np, int index,
                                 const char *con_id)
    {
            int ret;
            struct clk_hw *hw;
            struct of_phandle_args clkspec;
    
            ret = of_parse_clkspec(np, index, con_id, &clkspec);
            if (ret)
                    return ERR_PTR(ret);
    
            hw = of_clk_get_hw_from_clkspec(&clkspec);
            of_node_put(clkspec.np);
    
            return hw;
    }


    /**
    * of_parse_clkspec() - Parse a DT clock specifier for a given device node
    * @np: device node to parse clock specifier from
    * @index: index of phandle to parse clock out of. If index < 0, @name is used
    * @name: clock name to find and parse. If name is NULL, the index is used
    * @out_args: Result of parsing the clock specifier
    *
    * Parses a device node's "clocks" and "clock-names" properties to find the
    * phandle and cells for the index or name that is desired. The resulting clock
    * specifier is placed into @out_args, or an errno is returned when there's a
    * parsing error. The @index argument is ignored if @name is non-NULL.
    *
    * Example:
    *
    * phandle1: clock-controller@1 {
    * #clock-cells = <2>;
    * }
    *
    * phandle2: clock-controller@2 {
    * #clock-cells = <1>;
    * }
    *
    * clock-consumer@3 {
    * clocks = <&phandle1 1 2 &phandle2 3>;
    * clock-names = "name1", "name2";
    * }
    *
    * To get a device_node for `clock-controller@2' node you may call this
    * function a few different ways:
    *
    * of_parse_clkspec(clock-consumer@3, -1, "name2", &args);
    * of_parse_clkspec(clock-consumer@3, 1, NULL, &args);
    * of_parse_clkspec(clock-consumer@3, 1, "name2", &args);
    *
    * Return: 0 upon successfully parsing the clock specifier. Otherwise, -ENOENT
    * if @name is NULL or -EINVAL if @name is non-NULL and it can't be found in
    * the "clock-names" property of @np.
    */
    static int of_parse_clkspec(const struct device_node *np, int index,
    const char *name, struct of_phandle_args *out_args)
    {

     * Return: 0 upon successfully parsing the clock specifier. Otherwise, -ENOENT
     * if @name is NULL or -EINVAL if @name is non-NULL and it can't be found in
     * the "clock-names" property of @np.
     */
    static int of_parse_clkspec(const struct device_node *np, int index,
                                const char *name, struct of_phandle_args *out_args)
    {
            int ret = -ENOENT;
    
            /* Walk up the tree of devices looking for a clock property that matches */
            while (np) {
                    /*
                     * For named clocks, first look up the name in the
                     * "clock-names" property.  If it cannot be found, then index
                     * will be an error code and of_parse_phandle_with_args() will
                     * return -EINVAL.
                     */
                    if (name)
                            index = of_property_match_string(np, "clock-names", name);
                    ret = of_parse_phandle_with_args(np, "clocks", "#clock-cells",
                                                     index, out_args);
                    if (!ret)
                            break;
                    if (name && index >= 0)
                            break;
    
                    /*
                     * No matching clock found on this node.  If the parent node
                     * has a "clock-ranges" property, then we can try one of its
                     * clocks.
                     */
                    np = np->parent;
                    if (np && !of_get_property(np, "clock-ranges", NULL))
                            break;
                    index = 0;
            }
    
            return ret;
    }

    clocksource_sysfs

    1393            int error = subsys_system_register(&clocksource_subsys, NULL);
    (gdb) bt
    #0  init_clocksource_sysfs () at kernel/time/clocksource.c:1393
    #1  0xffffffff80002740 in do_one_initcall (fn=0xffffffff80c0a06c <init_clocksource_sysfs>) at init/main.c:1297
    #2  0xffffffff80c011c6 in do_initcall_level (command_line=0xffffffe0023ad640 "root", level=6) at init/main.c:1370
    #3  do_initcalls () at init/main.c:1386
    #4  do_basic_setup () at init/main.c:1406
    #5  kernel_init_freeable () at init/main.c:1609
    #6  0xffffffff80b14572 in kernel_init (unused=<optimized out>) at init/main.c:1501
    #7  0xffffffff8000378c in handle_exception () at arch/riscv/kernel/entry.S:232
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    [root@centos7 images]# ls /sys/devices/system/clocksource/clocksource0
    available_clocksource  current_clocksource  power  subsystem  uevent  unbind_clocksource
    [root@centos7 images]# ls  /sys/bus/clocksource -al
    total 0
    drwxr-xr-x  4 root root     0 Oct 31 23:51 .
    drwxr-xr-x 26 root root     0 Sep 27 22:16 ..
    drwxr-xr-x  2 root root     0 Sep 27 22:16 devices
    drwxr-xr-x  2 root root     0 Sep 27 22:16 drivers
    -rw-r--r--  1 root root 65536 Oct 31 23:39 drivers_autoprobe
    --w-------  1 root root 65536 Oct 31 23:39 drivers_probe
    --w-------  1 root root 65536 Oct 31 23:39 uevent
    [root@centos7 images]# ls  /sys/bus/ -al
    total 0
    drwxr-xr-x 26 root root 0 Oct 31 23:51 .
    dr-xr-xr-x 12 root root 0 Sep 27 22:16 ..
    drwxr-xr-x  4 root root 0 Sep 27 22:16 acpi
    drwxr-xr-x  4 root root 0 Sep 27 22:16 amba
    drwxr-xr-x  4 root root 0 Sep 27 22:16 clockevents
    drwxr-xr-x  4 root root 0 Oct 31 23:51 clocksource
    drwxr-xr-x  4 root root 0 Sep 27 22:16 container
    drwxr-xr-x  4 root root 0 Sep 27 22:16 cpu
    drwxr-xr-x  4 root root 0 Sep 27 22:16 edac
    drwxr-xr-x  4 root root 0 Sep 27 22:16 event_source
    drwxr-xr-x  4 root root 0 Sep 27 22:16 gpio
    drwxr-xr-x  4 root root 0 Sep 27 22:16 hid
    drwxr-xr-x  4 root root 0 Sep 27 22:16 i2c
    drwxr-xr-x  4 root root 0 Sep 27 22:16 mdio_bus
    drwxr-xr-x  4 root root 0 Sep 27 22:16 node
    drwxr-xr-x  4 root root 0 Sep 27 22:16 nvmem
    drwxr-xr-x  5 root root 0 Sep 27 22:16 pci
    drwxr-xr-x  4 root root 0 Sep 27 22:16 pci_express
    drwxr-xr-x  4 root root 0 Sep 27 22:16 platform
    drwxr-xr-x  4 root root 0 Sep 27 22:16 pnp
    drwxr-xr-x  4 root root 0 Sep 27 22:16 scsi
    drwxr-xr-x  4 root root 0 Sep 27 22:16 serio
    drwxr-xr-x  4 root root 0 Sep 27 22:16 spi
    drwxr-xr-x  4 root root 0 Sep 27 22:16 usb
    drwxr-xr-x  4 root root 0 Sep 27 22:16 usb-serial
    drwxr-xr-x  4 root root 0 Sep 27 22:16 workqueue
    [root@centos7 images]# ls  /sys/bus/clocksource/
    devices/           drivers/           drivers_autoprobe  drivers_probe      uevent             
    [root@centos7 images]# ls  /sys/bus/clocksource/devices/ -al
    total 0
    drwxr-xr-x 2 root root 0 Oct 31 23:51 .
    drwxr-xr-x 4 root root 0 Oct 31 23:51 ..
    lrwxrwxrwx 1 root root 0 Sep 27 22:16 clocksource0 -> ../../../devices/system/clocksource/clocksource0   --链接
    [root@centos7 images]# 
    nit_clocksource_sysfs  -->
         subsys_system_register
              subsys_register
                  bus_register
                        kset_register
    Breakpoint 4, 0xffffffff80747384 in bus_register () at drivers/base/bus.c:1089
    1089                    err = -ENOMEM;
    (gdb) bt
    #0  0xffffffff80747384 in bus_register () at drivers/base/bus.c:1089
    #1  0xffffffff80747724 in subsys_register (parent_of_root=0xffffffe0023a7738, groups=0x0, subsys=0xffffffff81891560 <clocksource_subsys>) at drivers/base/bus.c:1083
    #2  subsys_system_register (subsys=0xffffffff81891560 <clocksource_subsys>, groups=0x0) at drivers/base/bus.c:1139
    #3  0xffffffff80c0a096 in init_clocksource_sysfs () at kernel/time/clocksource.c:1393
    #4  0xffffffff80002740 in do_one_initcall (fn=0xffffffff80c0a06c <init_clocksource_sysfs>) at init/main.c:1297
    #5  0xffffffff80c011c6 in do_initcall_level (command_line=0xffffffe0023ad640 "root", level=6) at init/main.c:1370
    #6  do_initcalls () at init/main.c:1386
    #7  do_basic_setup () at init/main.c:1406
    #8  kernel_init_freeable () at init/main.c:1609
    #9  0xffffffff80b14572 in kernel_init (unused=<optimized out>) at init/main.c:1501
    #10 0xffffffff8000378c in handle_exception () at arch/riscv/kernel/entry.S:232
    Backtrace stopped: frame did not save the PC
    (gdb) list
    1084            if (err < 0)
    1085                    return err;
    1086
    1087            dev = kzalloc(sizeof(struct device), GFP_KERNEL);
    1088            if (!dev) {
    1089                    err = -ENOMEM;
    1090                    goto err_dev;
    1091            }
    1092
    1093            err = dev_set_name(dev, "%s", subsys->name);
    (gdb) s
    
    Breakpoint 4, bus_register (bus=bus@entry=0xffffffff81891560 <clocksource_subsys>) at ./include/linux/slab.h:591
    591                     return kmem_cache_alloc_trace(
    (gdb) list
    586                     index = kmalloc_index(size);
    587
    588                     if (!index)
    589                             return ZERO_SIZE_PTR;
    590
    591                     return kmem_cache_alloc_trace(
    592                                     kmalloc_caches[kmalloc_type(flags)][index],
    593                                     flags, size);
    594     #endif
    595             }
    (gdb) n
    787             priv = kzalloc(sizeof(struct subsys_private), GFP_KERNEL);
    (gdb) n
    788             if (!priv)
    (gdb) n
    791             priv->bus = bus;
    (gdb) p *bus
    $1 = {name = 0xffffffff81320050 "clocksource", dev_name = 0xffffffff81320050 "clocksource", dev_root = 0x0, bus_groups = 0x0, dev_groups = 0x0, drv_groups = 0x0, match = 0x0, uevent = 0x0, probe = 0x0, sync_state = 0x0, remove = 0x0, shutdown = 0x0, 
      online = 0x0, offline = 0x0, suspend = 0x0, resume = 0x0, num_vf = 0x0, dma_configure = 0x0, pm = 0x0, iommu_ops = 0x0, p = 0x0, lock_key = {<No data fields>}, need_parent_lock = false}
    (gdb) n
    794             BLOCKING_INIT_NOTIFIER_HEAD(&priv->bus_notifier);
    (gdb) n
    796             retval = kobject_set_name(&priv->subsys.kobj, "%s", bus->name);
    (gdb) p  bus->name
    $2 = 0xffffffff81320050 "clocksource"
    (gdb) n
    797             if (retval)
    (gdb) n
    800             priv->subsys.kobj.kset = bus_kset;
    (gdb) p bus_kset
    $3 = (struct kset *) 0xffffffe0023a76c0
    (gdb) p *bus_kset
    $4 = {list = {next = 0xffffffe0023a5c20, prev = 0xffffffe002509020}, list_lock = {{rlock = {raw_lock = {lock = 0}}}}, kobj = {name = 0xffffffff8133e010 "bus", entry = {next = 0xffffffe0023a76e0, prev = 0xffffffe0023a76e0}, parent = 0x0, kset = 0x0, 
        ktype = 0xffffffff81964640 <kset_ktype>, sd = 0xffffffe0023a8f80, kref = {refcount = {refs = {counter = 41}}}, state_initialized = 1, state_in_sysfs = 1, state_add_uevent_sent = 0, state_remove_uevent_sent = 0, uevent_suppress = 0}, 
      uevent_ops = 0xffffffff810b59c8 <bus_uevent_ops>}
    (gdb) n
    801             priv->subsys.kobj.ktype = &bus_ktype;
    (gdb) n
    802             priv->drivers_autoprobe = 1;
    (gdb) n
    804             retval = kset_register(&priv->subsys);
    (gdb) n
    805             if (retval)
    (gdb) n
    808             retval = bus_create_file(bus, &bus_attr_uevent);
    (gdb) n
    809             if (retval)
    (gdb) n
    812             priv->devices_kset = kset_create_and_add("devices", NULL,
    (gdb) n
    814             if (!priv->devices_kset) {
    (gdb) n
    819             priv->drivers_kset = kset_create_and_add("drivers", NULL,
    (gdb) n
    821             if (!priv->drivers_kset) {
    (gdb) n
    826             INIT_LIST_HEAD(&priv->interfaces);
    (gdb) n
    827             __mutex_init(&priv->mutex, "subsys mutex", key);
    (gdb) n
    828             klist_init(&priv->klist_devices, klist_devices_get, klist_devices_put);
    (gdb) n
    829             klist_init(&priv->klist_drivers, NULL, NULL);
    (gdb) n
    831             retval = add_probe_files(bus);
    (gdb) n
    835             retval = bus_add_groups(bus, bus->bus_groups);
    (gdb) c
    Continuing.





    static int __init init_clocksource_sysfs(void)
    {
            int error = subsys_system_register(&clocksource_subsys, NULL);
    
            if (!error)
                    error = device_register(&device_clocksource);
    
            return error;
    }
    /**
     * subsys_system_register - register a subsystem at /sys/devices/system/
     * @subsys: system subsystem
     * @groups: default attributes for the root device
     *
     * All 'system' subsystems have a /sys/devices/system/<name> root device
     * with the name of the subsystem. The root device can carry subsystem-
     * wide attributes. All registered devices are below this single root
     * device and are named after the subsystem with a simple enumeration
     * number appended. The registered devices are not explicitly named;
     * only 'id' in the device needs to be set.
     *
     * Do not use this interface for anything new, it exists for compatibility
     * with bad ideas only. New subsystems should use plain subsystems; and
     * add the subsystem-wide attributes should be added to the subsystem
     * directory itself and not some create fake root-device placed in
     * /sys/devices/system/<name>.
     */
    int subsys_system_register(struct bus_type *subsys,
                               const struct attribute_group **groups)
    {
            return subsys_register(subsys, groups, &system_kset->kobj);
    }

    __clocksource_register_scale

    Linux时间子系统之时钟源层(Clock Source)

    (gdb) target remote:1234
    Remote debugging using :1234
    0x0000000000001000 in ?? ()
    (gdb) b clocksource_register_scale
    Function "clocksource_register_scale" not defined.
    Make breakpoint pending on future shared library load? (y or [n]) n
    (gdb) b __clocksource_register_scale
    Breakpoint 5 at 0xffffffff8008370c: __clocksource_register_scale. (2 locations)
    (gdb) c
    Continuing.
    
    Breakpoint 5, 0xffffffff8008370c in __clocksource_register_scale () at kernel/time/clocksource.c:864
    864             max_cycles = min(max_cycles, mask);
    (gdb) bt
    #0  0xffffffff8008370c in __clocksource_register_scale () at kernel/time/clocksource.c:864
    #1  0xffffffff80c2b5f8 in clocksource_register_hz (hz=<optimized out>, cs=0xffffffff819a3f58 <riscv_clocksource>) at ./include/linux/clocksource.h:246
    #2  riscv_timer_init_dt (n=<optimized out>) at drivers/clocksource/timer-riscv.c:140
    #3  0xffffffff80c2b3d6 in timer_probe () at drivers/clocksource/timer-probe.c:30
    #4  0xffffffff80c0367c in time_init () at arch/riscv/kernel/time.c:31
    #5  0xffffffff80c00d38 in start_kernel () at init/main.c:1041
    #6  0xffffffff80001182 in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 5, __clocksource_register_scale (cs=0xffffffff819a3f58 <riscv_clocksource>, scale=1, freq=10000000) at kernel/time/clocksource.c:1122
    1122            clocksource_arch_init(cs);
    (gdb) bt
    #0  __clocksource_register_scale (cs=0xffffffff819a3f58 <riscv_clocksource>, scale=1, freq=10000000) at kernel/time/clocksource.c:1122
    #1  0xffffffff80c2b5f8 in clocksource_register_hz (hz=<optimized out>, cs=0xffffffff819a3f58 <riscv_clocksource>) at ./include/linux/clocksource.h:246
    #2  riscv_timer_init_dt (n=<optimized out>) at drivers/clocksource/timer-riscv.c:140
    #3  0xffffffff80c2b3d6 in timer_probe () at drivers/clocksource/timer-probe.c:30
    #4  0xffffffff80c0367c in time_init () at arch/riscv/kernel/time.c:31
    #5  0xffffffff80c00d38 in start_kernel () at init/main.c:1041
    #6  0xffffffff80001182 in _start_kernel () at arch/riscv/kernel/head.S:327
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 5, 0xffffffff8008370c in __clocksource_register_scale () at kernel/time/clocksource.c:864
    864             max_cycles = min(max_cycles, mask);
    (gdb) bt
    #0  0xffffffff8008370c in __clocksource_register_scale () at kernel/time/clocksource.c:864
    #1  0xffffffff80c0a1b0 in __clocksource_register (cs=0xffffffff81891870 <clocksource_jiffies>) at ./include/linux/clocksource.h:241
    #2  init_jiffies_clocksource () at kernel/time/jiffies.c:85
    #3  0xffffffff80002740 in do_one_initcall (fn=0xffffffff80c0a184 <init_jiffies_clocksource>) at init/main.c:1297
    #4  0xffffffff80c011c6 in do_initcall_level (command_line=0xffffffe0023ad640 "root", level=1) at init/main.c:1370
    #5  do_initcalls () at init/main.c:1386
    #6  do_basic_setup () at init/main.c:1406
    #7  kernel_init_freeable () at init/main.c:1609
    #8  0xffffffff80b14572 in kernel_init (unused=<optimized out>) at init/main.c:1501
    #9  0xffffffff8000378c in handle_exception () at arch/riscv/kernel/entry.S:232
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    
    Breakpoint 5, __clocksource_register_scale (cs=0xffffffff81891870 <clocksource_jiffies>, scale=1, freq=0) at kernel/time/clocksource.c:1122
    1122            clocksource_arch_init(cs);
    (gdb) bt
    #0  __clocksource_register_scale (cs=0xffffffff81891870 <clocksource_jiffies>, scale=1, freq=0) at kernel/time/clocksource.c:1122
    #1  0xffffffff80c0a1b0 in __clocksource_register (cs=0xffffffff81891870 <clocksource_jiffies>) at ./include/linux/clocksource.h:241
    #2  init_jiffies_clocksource () at kernel/time/jiffies.c:85
    #3  0xffffffff80002740 in do_one_initcall (fn=0xffffffff80c0a184 <init_jiffies_clocksource>) at init/main.c:1297
    #4  0xffffffff80c011c6 in do_initcall_level (command_line=0xffffffe0023ad640 "root", level=1) at init/main.c:1370
    #5  do_initcalls () at init/main.c:1386
    #6  do_basic_setup () at init/main.c:1406
    #7  kernel_init_freeable () at init/main.c:1609
    #8  0xffffffff80b14572 in kernel_init (unused=<optimized out>) at init/main.c:1501
    #9  0xffffffff8000378c in handle_exception () at arch/riscv/kernel/entry.S:232
    Backtrace stopped: frame did not save the PC
    (gdb) c
    Continuing.
    # 
     
    # 
    #  cat /sys/devices/system/clocksource/clocksource0/current_clocksource
    riscv_clocksource
     
    # echo 'arm,sp804' >  /sys/devices/system/clocksource/clocksource0/current_clock
    source
    [  153.328448] clocksource: Switched to clocksource arm,sp804
    # 
    #  cat /sys/devices/system/clocksource/clocksource0/current_clocksource
    arm,sp804
    # 
    # date
    Thu Jan  1 00:02:56 UTC 1970
    # 
    # ls
    # 

    [时钟管理] arm 时间系统 1

    Linux 时钟框架学习笔记

    handle_syscall_trace_exit

  • 相关阅读:
    hdu 1003 dp最大子序列和
    模拟题 (+queue队列知识)
    hdu 1016 DFS
    OSGi 系列(二)之 Hello World
    OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统
    Mina 系列(四)之KeepAliveFilter -- 心跳检测
    Mina 系列(三)之自定义编解码器.md
    Mina 系列(二)之基础
    Mina 快速入门
    Java 8 Optional 类深度解析
  • 原文地址:https://www.cnblogs.com/dream397/p/15434059.html
Copyright © 2020-2023  润新知