Pjesa 4: Fundja, ngarkojmë Linux në RocketChip RISC-V

Pjesa 4: Fundja, ngarkojmë Linux në RocketChip RISC-V Në imazh, bërthama Linux po ju përshëndet përmes GPIO.

Në këtë pjesë të historisë së portimit të RISC-V RocketChip në një pllakë kineze me Cyclone IV, ne do ta nisim Linux, si dhe do të mësojmë të konfigurojmë vetë IP Core të kontrolluesit të memories dhe pak do të redaktojmë përshkrimin dts të pajisjeve. Ky artikull është një vazhdim i pjesës së tretë, por, ndryshe nga e kaluara e zgjeruar, do të jetë mjaft e shkurtër.

… Sepse setup_smp thirret vetëm nëse bërthama është e konfiguruar me mbështetje për SMP, mund të provoni të çaktivizoni multi-kërkesën. Do të ishte e pakëndshme, nëse do të duhej të realizoja gjithashtu mbështetje për atomaritetin në modul të memories (më dukej se me këtë, cache e menaxhon vetë), por në rastin e një bërthamë të vetme, nuk duhet të na pengojë.

Sidoqoftë, nuk funksionoi...

[    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[    0.000000] Linux version 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 Thu Jul 4 18:38:10 MSK 2019
[    0.000000] bootconsole [early0] enabled
[    0.000000] Initial ramdisk at: 0x(____ptrval____) (16777216 bytes)
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000]   Normal   [mem 0x00000000c0000000-0x00000bffffffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] software IO TLB: mapped [mem 0xbb1fc000-0xbf1fc000] (64MB)
[    0.000000] Unable to find "cpu" devicetree entry
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 258055
[    0.000000] Kernel command line: debug console=ttySIF0,125200 root=/dev/mmcblk0p2 loglevel=7 rootwait
[    0.000000] Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
[    0.000000] Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)
[    0.000000] Sorting __ex_table...
[    0.000000] BUG: Bad page state in process swapper  pfn:80bf7
[    0.000000] page:ffffffe03f029e08 count:0 mapcount:-65280 mapping:0000000000000000 index:0x1
[    0.000000] flags: 0x0()
[    0.000000] raw: 0000000000000000 0000000000000100 0000000000000200 0000000000000000
[    0.000000] raw: 0000000000000001 0000000000000000 00000000ffff00ff
[    0.000000] page dumped because: nonzero mapcount
[    0.000000] Modules linked in:
[    0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 4.19.0-sifive-1+ #1
[    0.000000] Call Trace:
[    0.000000] [<ffffffe00002cfde>] walk_stackframe+0x0/0xa0
[    0.000000] [<ffffffe00002d1da>] show_stack+0x2a/0x34
[    0.000000] [<ffffffe00063c898>] chachachllachachachTradeonachachach_inachachipachachachachllachachachTradeonachachachdevachachachypachachachllachachachTradeona+0x20/0x28
[    0.000000] [<ffffffe00009499c>] bad_page+0xe4/0x102
[    0.000000] [<ffffffe0000949f2>] free_pages_check_bad+0x38/0x7a
[    0.000000] [<ffffffe000094bb0>] free_pcppages_bulk+0x106/0x36c
[    0.000000] [<ffffffe0000957be>] free_unref_page_commit.isra.23+0x86/0x8e
[    0.000000] [<ffffffe0000960bc>] free_unref_page+0x44/0x58
[    0.000000] [<ffffffe0000960de>] __free_pages.part.28+0xe/0x22
[    0.000000] [<ffffffe0000056da>] __free_pages_bootmem+0x86/0x90
[    0.000000] [<ffffffe000007c46>] free_all_bootmem+0x156/0x1ba
[    0.000000] [<ffffffe0000023f8>] mem_init+0x36/0x44
[    0.000000] [<ffffffe0000007a0>] start_kernel+0x1aa/0x328
[    0.000000] [<ffffffe000000058>] _sinittext+0x58/0x5c
[    0.000000] Disabling lock debugging due to kernel taint
[    0.000000] BUG: Bad page state in process swapper  pfn:80bf9
[    0.000000] page:ffffffe03f029e78 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[    0.000000] flags: 0x0()
[    0.000000] raw: 0000000000000000 ffffffe03f020080 ffffffe03f020080 0000000000000000
[    0.000000] raw: 0000000000000000 0000000000000000 00000000ffff00ff
[    0.000000] page dumped because: nonzero mapcount
[    0.000000] Modules linked in:
[    0.000000] CPU: 0 PID: 0 Comm: swapper Tainted: G    B             4.19.0-sifive-1+ #1
[    0.000000] Call Trace:
[    0.000000] [<ffffffe00002cfde>] walk_stackframe+0x0/0xa0
[    0.000000] [<ffffffe00002d1da>] show_stack+0x2a/0x34
[    0.000000] [<ffffffe00063c898>] chachachllachachachTradeonachachach_inachachipachachachachllachachachTradeonachachachdevachachachypachachachllachachachTradeona+0x20/0x28
[    0.000000] [<ffffffe00009499c>] bad_page+0xe4/0x102
[    0.000000] [<ffffffe0000949f2>] free_pages_check_bad+0x38/0x7a
[    0.000000] [<ffffffe0000955c6>] __free_pages_ok+0x3fe/0x430
[    0.000000] [<ffffffe0000960ea>] __free_pages.part.28+0x1a/0x22
[    0.000000] [<ffffffe0000056da>] __free_pages_bootmem+0x86/0x90
[    0.000000] [<ffffffe000007c46>] free_all_bootmem+0x156/0x1ba
[    0.000000] [<ffffffe0000023f8>] mem_init+0x36/0x44
[    0.000000] [<ffffffe0000007a0>] start_kernel+0x1aa/0x328
[    0.000000] [<ffffffe000000058>] _sinittext+0x58/0x5c
[    0.000000] BUG: Bad page state in process swapper  pfn:80bfa
[    0.000000] page:ffffffe03f029eb0 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[    0.000000] flags: 0x0()
[    0.000000] raw: 0000000000000000 ffffffe03f0200b8 ffffffe03f0200b8 0000000000000000
[    0.000000] raw: 0000000000000000 0000000000000000 00000000ffff00ff
[    0.000000] page dumped because: nonzero mapcount
[    0.000000] Modules linked in:
[    0.000000] CPU: 0 PID: 0 Comm: swapper Tainted: G    B             4.19.0-sifive-1+ #1
[    0.000000] Call Trace:
[    0.000000] [<ffffffe00002cfde>] walk_stackframe+0x0/0xa0
[    0.000000] [<ffffffe00002d1da>] show_stack+0x2a/0x34
[    0.000000] [<ffffffe00063c898>] chachachllachachachTradeonachachach_inachachipachachachachllachachachTradeonachachachdevachachachypachachachllachachachTradeona+0x20/0x28
[    0.000000] [<ffffffe00009499c>] bad_page+0xe4/0x102
[    0.000000] [<ffffffe0000949f2>] free_pages_check_bad+0x38/0x7a
[    0.000000] [<ffffffe0000955c6>] __free_pages_ok+0x3fe/0x430
[    0.000000] [<ffffffe0000960ea>] __free_pages.part.28+0x1a/0x22
[    0.000000] [<ffffffe0000056da>] __free_pages_bootmem+0x86/0x90
[    0.000000] [<ffffffe000007c46>] free_all_bootmem+0x156/0x1ba
[    0.000000] [<ffffffe0000023f8>] mem_init+0x36/0x44
[    0.000000] [<ffffffe0000007a0>] start_kernel+0x1aa/0x328
[    0.000000] [<ffffffe000000058>] _sinittext+0x58/0x5c
[    0.000000] BUG: Bad page state in process swapper  pfn:80bfb
[    0.000000] page:ffffffe03f029ee8 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[    0.000000] flags: 0x0()
[    0.000000] raw: 0000000000000000 ffffffe03f0200f0 ffffffe03f0200f0 0000000000000000
[    0.000000] raw: 0000000000000000 0000000000000000 00000000ffff00ff
[    0.000000] page dumped because: nonzero mapcount
[    0.000000] Modules linked in:
[    0.000000] CPU: 0 PID: 0 Comm: swapper Tainted: G    B             4.19.0-sifive-1+ #1
[    0.000000] Call Trace:
[    0.000000] [<ffffffe00002cfde>] walk_stackframe+0x0/0xa0
[    0.000000] [<ffffffe00002d1da>] show_stack+0x2a/0x34
[    0.000000] [<ffffffe00063c898>] chachachllachachachTradeonachachach_inachachipachachachachllachachachTradeonachachachdevachachachypachachachllachachachTradeona+0x20/0x28
[    0.000000] [<ffffffe00009499c>] bad_page+0xe4/0x102
[    0.000000] [<ffffffe0000949f2>] free_pages_check_bad+0x38/0x7a
[    0.000000] [<ffffffe0000955c6>] __free_pages_ok+0x3fe/0x430
[    0.000000] [<ffffffe0000960ea>] __free_pages.part.28+0x1a/0x22
[    0.000000] [<ffffffe0000056da>] __free_pages_bootmem+0x86/0x90
[    0.000000] [<ffffffe000007c46>] free_all_bootmem+0x156/0x1ba
[    0.000000] [<ffffffe0000023f8>] mem_init+0x36/0x44
[    0.000000] [<ffffffe0000007a0>] start_kernel+0x1aa/0x328
[    0.000000] [<ffffffe000000058>] _sinittext+0x58/0x5c
[    0.000000] BUG: Bad page state in process swapper  pfn:80bfc
[    0.000000] page:ffffffe03f029f20 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[    0.000000] flags: 0x0()
[    0.000000] raw: 0000000000000000 ffffffe03f020028 ffffffe03f020028 0000000000000000
[    0.000000] raw: 0000000000000000 0000000000000000 00000000ffff00ff
...

Занятно, что после всей отладки я решил посмотреть, как должен выглядеть «референсный» вывод ядра, сказал make qemu, и увидел аналогичную ошибку.

Fatkeqësisht, niveli i ardhshëm (Linux kernel) është më i vështirë: GDB, i lidhur përmes JTAG me RocketChip, duket se punon me adresat fizike pa marrë parasysh se si është konfiguruar MMU, ndërsa bërthama në momentin që na intereson tashmë ka ndarë mapimin e adresave, kështu që thjesht të thuash display/10i $pc nuk do të funksionojë — do të shohim vetëm shumë unimp. Sidoqoftë, nëse tashmë kemi gjetur offset-in (duket se 0x80200000 -> 0xffffffe000000000), atëherë mund të bëjmë një mashtrim:

1: x/10i $pc
=> 0xffffffe000002436 :      unimp
   0xffffffe000002438 :    unimp
   0xffffffe00000243a :    unimp
   0xffffffe00000243c :    unimp
   0xffffffe00000243e :    unimp
   0xffffffe000002440 :   unimp
   0xffffffe000002442 :   unimp
   0xffffffe000002444 :   unimp
   0xffffffe000002446 :   unimp
   0xffffffe000002448 :   unimp
(gdb) undisplay 1
(gdb) display/10i ($pc - 0xffffffe000002436 + 0x80202436)
2: x/10i ($pc - 0xffffffe000002436 + 0x80202436)
   0x80202436:  addi    sp,sp,-96
   0x80202438:  sd      s0,80(sp)
   0x8020243a:  sd      s1,72(sp)
   0x8020243c:  sd      s2,64(sp)
   0x8020243e:  sd      s3,56(sp)
   0x80202440:  sd      s4,48(sp)
   0x80202442:  sd      s5,40(sp)
   0x80202444:  sd      s6,32(sp)
   0x80202446:  sd      s7,24(sp)
   0x80202448:  sd      s8,16(sp)

Breakpoint-et vendosen në mënyrë të ngjashme:

(gdb) p setup_smp
$1 = {} 0xffffffe000002436 
(gdb) b *0x80202436
Breakpoint 1 at 0x80202436
(gdb) c
Vazhdimi.

Programi mori sinjalin SIGTRAP, Shenjë/trap pregjësimi.
setup_smp () në /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/smpboot.c:58
58              while ((dn = of_find_node_by_type(dn, "cpu"))) {
(gdb) bt
#0  setup_smp () në /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/smpboot.c:58
#1  0xffffffe0000022a2 në setup_arch () në /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/setup.c:253
#2  0x0000000000000000 në ?? ()
Backtrace u ndal: korniza nuk e ruajti PC-në

Problemi është se ato duhet të hiqen manualisht për të shkuar përpara — për GDB është një lloj kapshtari krejtësisht i paqartë. Ah po, nëse rastësisht thoni s ose n në vend të si, gdb do të përpiqet të futë një brakpoint të paqartë, i cili për arsye të dukshme nuk do të vendoset, por nuk mund ta ndaloni GDB-në. Por mos u nxito të rivendosni plaka — sipas vëzhgimeve të mia, mjafton të rinitë vetëm gdb (mbani parasysh se brakpoint-et e vjetra mund të mos zhduken).

Në fakt, do të duhet të merremi me problemin fillestar: vendosja e debugging printk në funksion of_find_node_by_type, e përdorur nga kodi për të kërkuar bërthamën e ngarkimit të procesorit, tregon se ajo sheh një farë të dhune në vend të emrave të tipeve të pajisjeve. Për shembull, ajo merr ndonjë rresht "Port serial", ndërsa asgjë e tillë nuk është në dtb në fushën device_type.Pas kërkimit të këtyre bajtëve në imazhin e bërthamës, i gjeta, i shikova offset-in, dhe kuptova të qartë: madhësia e bërthamës në parametrat e ngarkimit është dukshëm nënvlerësuar: i është bërë alokimi prej 8Mb, ndërsa merr më shumë se dhjetë. I ndava 16Mb, por çuditë nuk u ndalën. Pas disa përpjekjeve për të lexuar FDT nga adresa të ndryshme (në mënyrë normale adresa i dërgohet bërthamës në regjistrin a1), në fund vendosa të gjurmoj atë që sot aty po analizohet. Fati i mirë, në vend të rreshtave me debugger (dhe ne e dimë që ka nuanca në lidhje me mapimin e adresave, të cilat duhet ndonjëherë të zgjidhen), mund të thjesht dhe mjaftë duke përdorur një dosje drivers/of/fdt.c të tregoni #define pr_debug printk. Në përfundim, u arrit:

shtimi i output debugging

diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c
index 3db0d71d128b..fac47df9d1db 100644
--- a/arch/riscv/kernel/setup.c
+++ b/arch/riscv/kernel/setup.c
@@ -173,6 +173,7 @@ asmlinkage void __init setup_vm(void)

 void __init parse_dtb(unsigned int hartid, void *dtb)
 {
+       printk("HART = %u DTB = %lxn", hartid, dtb);
        early_init_dt_scan(__va(dtb));
 }

diff --git a/drivers/of/base.c b/drivers/of/base.c
index 74eaedd5b860..c019e4158e1d 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -940,10 +940,12 @@ struct device_node *of_find_node_by_type(struct device_node *from,
        unsigned long flags;

        raw_spin_lock_irqsave(&devtree_lock, flags);
-       for_each_of_allnodes_from(from, np)
+       for_each_of_allnodes_from(from, np) {
+               printk("%lx %lx [%s] | [%s]n", from, np, np->type, type);
                if (np->type && (of_node_cmp(np->type, type) == 0)
                    && of_node_get(np))
                        break;
+       }
        of_node_put(from);
        raw_spin_unlock_irqrestore(&devtree_lock, flags);
        return np;
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 800ad252cf9c..2b45870ebada 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -31,6 +31,8 @@

 #include "of_private.h"

+#define pr_debug printk
+
 /*
  * of_fdt_limit_memory - limit the number of regions in the /memory node
  * @limit: maximum entries
@@ -1253,6 +1255,7 @@ bool __init early_init_dt_scan(void *params)
  */
 void __init unflatten_device_tree(void)
 {
+       printk("INITIAL: %lxn", initial_boot_params);
        __unflatten_device_tree(initial_boot_params, NULL, &of_root,
                                early_init_dt_alloc_memory_arch, false);

Output në harduer

                SIFIVE, INC.

         5555555555555555555555555
        5555                   5555
       5555                     5555
      5555                       5555
     5555       5555555555555555555555
    5555       555555555555555555555555
   5555                             5555
  5555                               5555
 5555                                 5555
5555555555555555555555555555          55555
 55555           555555555           55555
   55555           55555           55555
     55555           5           55555
       55555                   55555
         55555               55555
           55555           55555
             55555       55555
               55555   55555
                 555555555
                   55555
                     5

           SiFive RISC-V Core IP
 {
  #address-cells = <0x00000001>;
  #size-cells = <0x00000001>;
  compatible = "freechips,rocketchip-unknown-dev";
  model = "freechips,rocketchip-unknown";
  chosen {
    linux,initrd-start = <0x82000000>;
    riscv,kernel-end = <0x81200000>;
    riscv,kernel-start = <0x80200000>;
    #address-cells = <0x00000001>;
    #size-cells = <0x00000000>;
    bootargs = <0x64656275 0x6720636f 0x6e736f6c 0x653d7474 0x79534946 0x302c3132 0x35323030 0x20726f6f 0x743d2f64 0x65762f6d 0x6d63626c 0x6b307032 0x206c6f67 0x6c657665 0x6c3d3720 0x726f6f74 0x77616974>;
  }
  firmware {
    sifive,uboot = "YYYY-MM-DD";
  }
  aliases {
    serial0 = <0x2f736f63 0x2f736572 0x69616c40 0x36343030 0x30303030>;
  }
  cpus {
    #address-cells = <0x00000001>;
    #size-cells = <0x00000000>;
    cpu@0 {
      device_type = "cpu";
      clock-frequency = <0x00000000>;
      compatible = "sifive,rocket0", "riscv";
      d-cache-block-size = <0x00000010>;
      d-cache-sets = <0x00000040>;
      d-cache-size = <0x00001000>;
      d-tlb-sets = <0x00000001>;
      d-tlb-size = <0x00000020>;
      i-cache-block-size = <0x00000010>;
      i-cache-sets = <0x00000040>;
      i-cache-size = <0x00001000>;
      i-tlb-sets = <0x00000001>;
      i-tlb-size = <0x00000020>;
      mmu-type = "riscv,sv39";
      next-level-cache = <0x00000001>;
      reg = <0x00000000>;
      riscv,isa = "rv64imafdc";
      status = "okay";
      timebase-frequency = <0x000f4240>;
      tlb-split;
      interrupt-controller {
        #interrupt-cells = <0x00000001>;
        compatible = "riscv,cpu-intc";
        interrupt-controller;
        phandle = <0x00000002>;
      }
    }
  }
  ram@80000000 {
    device_type = "memory";
    reg = <0x80000000 0x40000000>;
    reg-names = "mem";
    phandle = <0x00000001>;
  }
  soc {
    #address-cells = <0x00000001>;
    #size-cells = <0x00000001>;
    compatible = "freechips,rocketchip-unknown-soc", "simple-bus";
    ranges;
    clint@2000000 {
      compatible = "riscv,clint0";
      interrupts-extended = <0x00000002 0x00000003 0x00000002 0x00000007>;
      reg = <0x02000000 0x00010000>;
      reg-names = "control";
    }
    debug-controller@0 {
      compatible = "sifive,debug-013", "riscv,debug-013";
      interrupts-extended = <0x00000002 0x0000ffff>;
      reg = <0x00000000 0x00001000>;
      reg-names = "control";
    }
    gpio@64002000 {
      #gpio-cells = <0x00000002>;
      #interrupt-cells = <0x00000002>;
      compatible = "sifive,gpio0";
      gpio-controller;
      interrupt-controller;
      interrupt-parent = <0x00000003>;
      interrupts = <0x00000003 0x00000004 0x00000005 0x00000006 0x00000007 0x00000008>;
      reg = <0x64002000 0x00001000>;
      reg-names = "control";
    }
    interrupt-controller@c000000 {
      #interrupt-cells = <0x00000001>;
      compatible = "riscv,plic0";
      interrupt-controller;
      interrupts-extended = <0x00000002 0x0000000b 0x00000002 0x00000009>;
      reg = <0x0c000000 0x04000000>;
      reg-names = "control";
      riscv,max-priority = <0x00000007>;
      riscv,ndev = <0x00000008>;
      phandle = <0x00000003>;
    }
    rom@10000 {
      compatible = "sifive,maskrom0";
      reg = <0x00010000 0x00002000>;
      reg-names = "mem";
    }
    serial@64000000 {
      compatible = "sifive,uart0";
      interrupt-parent = <0x00000003>;
      interrupts = <0x00000002>;
      reg = <0x64000000 0x00001000>;
      reg-names = "control";
    }
    spi@64001000 {
      #address-cells = <0x00000001>;
      #size-cells = <0x00000000>;
      compatible = "sifive,spi0";
      interrupt-parent = <0x00000003>;
      interrupts = <0x00000001>;
      reg = <0x64001000 0x00001000>;
      reg-names = "control";
      mmc@0 {
        compatible = "mmc-spi-slot";
        disable-wp;
        reg = <0x00000000>;
        spi-max-frequency = <0x01312d00>;
        voltage-ranges = <0x00000ce4 0x00000ce4>;
      }
    }
    tlclk {
      #clock-cells = <0x00000000>;
      clock-frequency = <0x017d7840>;
      clock-output-names = "tlclk";
      compatible = "fixed-clock";
    }
  }
}
[    0.000000] HART = 0 DTB = 81200000
[    0.000000] search "chosen", depth: 0, uname:
[    0.000000] search "chosen", depth: 1, uname: chosen
[    0.000000] Looking for initrd properties...
[    0.000000] Command line is: debug console=ttySIF0,125200 root=/dev/mmcblk0p2 loglevel=7 rootwait
[    0.000000] dt_root_size_cells = 1
[    0.000000] dt_root_addr_cells = 1
[    0.000000] memory scan node ram@80000000, reg size 8,
[    0.000000]  - 80000000 ,  40000000
[    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[    0.000000] Linux version 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP Sat Jul 6 12:14:41 MSK 2019
[    0.000000] bootconsole [early0] enabled
[    0.000000] initrd not found or empty - disabling initrd
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000]   Normal   [mem 0x00000000c0000000-0x00000bffffffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] INITIAL: ffffffe001000000
[    0.000000]  -> unflatten_device_tree()
[    0.000000] Unflattening device tree:
[    0.000000] magic: d00dfeed
[    0.000000] size: 00001000
[    0.000000] version: 00000011
[    0.000000]   size is 13512, allocating...
[    0.000000]   unflattening (____ptrval____)...
[    0.000000] fixed up name for  ->
[    0.000000] fixed up name for chosen -> chosen
[    0.000000] fixed up name for firmware -> firmware
[    0.000000] fixed up name for aliases -> aliases
[    0.000000] fixed up name for cpus -> cpus
[    0.000000] fixed up name for cpu@0 -> cpu
[    0.000000] fixed up name for interrupt-controller -> interrupt-controller
[    0.000000] fixed up name for ram@80000000 -> ram
[    0.000000] fixed up name for soc -> soc
[    0.000000] fixed up name for clint@2000000 -> clint
[    0.000000] fixed up name for debug-controller@0 -> debug-controller
[    0.000000] fixed up name for gpio@64002000 -> gpio
[    0.000000] fixed up name for interrupt-controller@c000000 -> interrupt-controller
[    0.000000] fixed up name for rom@10000 -> rom
[    0.000000] fixed up name for serial@64000000 -> serial
[    0.000000] fixed up name for spi@64001000 -> spi
[    0.000000] fixed up name for mmc@0 -> mmc
[    0.000000] fixed up name for tlclk -> tlclk
[    0.000000]  <- unflatten_device_tree()
[    0.000000] software IO TLB: mapped [mem 0xbb1fc000-0xbf1fc000] (64MB)
[    0.000000] 0 ffffffe03effcab0 [attach() failed for %s with error %d
[    0.000000] ] | [cpu]
[    0.000000] 0 ffffffe03eff0020 [(null)] | [cpu]

Dalja në QEMU

                SIFIVE, INC.

         5555555555555555555555555
        5555                   5555
       5555                     5555
      5555                       5555
     5555       5555555555555555555555
    5555       555555555555555555555555
   5555                             5555
  5555                               5555
 5555                                 5555
5555555555555555555555555555          55555
 55555           555555555           55555
   55555           55555           55555
     55555           5           55555
       55555                   55555
         55555               55555
           55555           55555
             55555       55555
               55555   55555
                 555555555
                   55555
                     5

           SiFive RISC-V Core IP
 {
  #address-cells = <0x00000002>;
  #size-cells = <0x00000002>;
  compatible = "riscv-virtio";
  model = "riscv-virtio,qemu";
  chosen {
    linux,initrd-start = <0x00000000 0x88000000>;
    linux,initrd-end = <0x00000000 0x88442b86>;
    riscv,kernel-start = <0x00000000 0x80200000>;
    riscv,kernel-end = <0x00000000 0x80c482ac>;
    bootargs = "";
    stdout-path = <0x2f756172 0x74403130 0x30303030>;
  }
  uart@10000000 {
    interrupts = <0x0000000a>;
    interrupt-parent = <0x00000002>;
    clock-frequency = <0x00384000>;
    reg = <0x00000000 0x10000000 0x00000000 0x00000100>;
    compatible = "ns16550a";
  }
  test@100000 {
    reg = <0x00000000 0x00100000 0x00000000 0x00001000>;
    compatible = "sifive,test0";
  }
  virtio_mmio@10008000 {
    interrupts = <0x00000008>;
    interrupt-parent = <0x00000002>;
    reg = <0x00000000 0x10008000 0x00000000 0x00001000>;
    compatible = "virtio,mmio";
  }
  virtio_mmio@10007000 {
    interrupts = <0x00000007>;
    interrupt-parent = <0x00000002>;
    reg = <0x00000000 0x10007000 0x00000000 0x00001000>;
    compatible = "virtio,mmio";
  }
  virtio_mmio@10006000 {
    interrupts = <0x00000006>;
    interrupt-parent = <0x00000002>;
    reg = <0x00000000 0x10006000 0x00000000 0x00001000>;
    compatible = "virtio,mmio";
  }
  virtio_mmio@10005000 {
    interrupts = <0x00000005>;
    interrupt-parent = <0x00000002>;
    reg = <0x00000000 0x10005000 0x00000000 0x00001000>;
    compatible = "virtio,mmio";
  }
  virtio_mmio@10004000 {
    interrupts = <0x00000004>;
    interrupt-parent = <0x00000002>;
    reg = <0x00000000 0x10004000 0x00000000 0x00001000>;
    compatible = "virtio,mmio";
  }
  virtio_mmio@10003000 {
    interrupts = <0x00000003>;
    interrupt-parent = <0x00000002>;
    reg = <0x00000000 0x10003000 0x00000000 0x00001000>;
    compatible = "virtio,mmio";
  }
  virtio_mmio@10002000 {
    interrupts = <0x00000002>;
    interrupt-parent = <0x00000002>;
    reg = <0x00000000 0x10002000 0x00000000 0x00001000>;
    compatible = "virtio,mmio";
  }
  virtio_mmio@10001000 {
    interrupts = <0x00000001>;
    interrupt-parent = <0x00000002>;
    reg = <0x00000000 0x10001000 0x00000000 0x00001000>;
    compatible = "virtio,mmio";
  }
  cpus {
    #address-cells = <0x00000001>;
    #size-cells = <0x00000000>;
    timebase-frequency = <0x00989680>;
    cpu@0 {
      device_type = "cpu";
      reg = <0x00000000>;
      status = "okay";
      compatible = "riscv";
      riscv,isa = "rv64imafdcsu";
      mmu-type = "riscv,sv48";
      clock-frequency = <0x3b9aca00>;
      interrupt-controller {
        #interrupt-cells = <0x00000001>;
        interrupt-controller;
        compatible = "riscv,cpu-intc";
        linux,phandle = <0x00000001>;
        phandle = <0x00000001>;
      }
    }
  }
  memory@80000000 {
    device_type = "memory";
    reg = <0x00000000 0x80000000 0x00000000 0x40000000>;
  }
  soc {
    #address-cells = <0x00000002>;
    #size-cells = <0x00000002>;
    compatible = "simple-bus";
    ranges;
    pci@30000000 {
      interrupt-map-mask = <0x00001800 0x00000000 0x00000000 0x00000007>;
      interrupt-map = <0x00000000 0x00000000 0x00000000 0x00000001 0x00000002 0x00000020 0x00000000 0x00000000 0x00000000 0x00000002 0x00000002 0x00000021 0x00000000 0x00000000 0x00000000 0x00000003 0x00000002 0x00000022 0x00000000 0x00000000 0x00000000 0x00000004 0x00000002 0x00000023 0x00000800 0x00000000 0x00000000 0x00000001 0x00000002 0x00000021 0x00000800 0x00000000 0x00000000 0x00000002 0x00000002 0x00000022 0x00000800 0x00000000 0x00000000 0x00000003 0x00000002 0x00000023 0x00000800 0x00000000 0x00000000 0x00000004 0x00000002 0x00000020 0x00001000 0x00000000 0x00000000 0x00000001 0x00000002 0x00000022 0x00001000 0x00000000 0x00000000 0x00000002 0x00000002 0x00000023 0x00001000 0x00000000 0x00000000 0x00000003 0x00000002 0x00000020 0x00001000 0x00000000 0x00000000 0x00000004 0x00000002 0x00000021 0x00001800 0x00000000 0x00000000 0x00000001 0x00000002 0x00000023 0x00001800 0x00000000 0x00000000 0x00000002 0x00000002 0x00000020 0x00001800 0x00000000 0x00000000 0x00000003 0x00000002 0x00000021 0x00001800 0x00000000 0x00000000 0x00000004 0x00000002 0x00000022>;
      ranges = <0x01000000 0x00000000 0x00000000 0x00000000 0x03000000 0x00000000 0x00010000 0x02000000 0x00000000 0x40000000 0x00000000 0x40000000 0x00000000 0x40000000>;
      reg = <0x00000000 0x30000000 0x00000000 0x10000000>;
      dma-coherent;
      bus-range = <0x00000000 0x000002ff>;
      linux,pci-domain = <0x00000000>;
      device_type = "pci";
      compatible = "pci-host-ecam-generic";
      #size-cells = <0x00000002>;
      #interrupt-cells = <0x00000001>;
      #address-cells = <0x00000003>;
    }
    interrupt-controller@c000000 {
      linux,phandle = <0x00000002>;
      phandle = <0x00000002>;
      riscv,ndev = <0x00000035>;
      riscv,max-priority = <0x00000007>;
      reg-names = "control";
      reg = <0x00000000 0x0c000000 0x00000000 0x04000000>;
      interrupts-extended = <0x00000001 0x0000000b 0x00000001 0x00000009>;
      interrupt-controller;
      compatible = "riscv,plic0";
      #interrupt-cells = <0x00000001>;
      #address-cells = <0x00000000>;
    }
    clint@2000000 {
      interrupts-extended = <0x00000001 0x00000003 0x00000001 0x00000007>;
      reg = <0x00000000 0x02000000 0x00000000 0x00010000>;
      compatible = "riscv,clint0";
    }
  }
}
[    0.000000] HART = 0 DTB = 80e00000
[    0.000000] search "chosen", depth: 0, uname:
[    0.000000] search "chosen", depth: 1, uname: chosen
[    0.000000] Looking for initrd properties...
[    0.000000] initrd_start=0x88000000  initrd_end=0x88442b86
[    0.000000] Command line is: earlyprintk
[    0.000000] dt_root_size_cells = 2
[    0.000000] dt_root_addr_cells = 2
[    0.000000] memory scan node memory@80000000, reg size 16,
[    0.000000]  - 80000000 ,  40000000
[    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[    0.000000] Linux version 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP Sat Jul 6 12:14:41 MSK 2019
[    0.000000] bootconsole [early0] enabled
[    0.000000] Initial ramdisk at: 0x(____ptrval____) (4467590 bytes)
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000]   Normal   [mem 0x00000000c0000000-0x00000bffffffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] INITIAL: ffffffe000c00000
[    0.000000]  -> unflatten_device_tree()
[    0.000000] Unflattening device tree:
[    0.000000] magic: d00dfeed
[    0.000000] size: 00000d56
[    0.000000] version: 00000011
[    0.000000]   size is 14192, allocating...
[    0.000000]   unflattening (____ptrval____)...
[    0.000000] fixed up name for  ->
[    0.000000] fixed up name for chosen -> chosen
[    0.000000] fixed up name for uart@10000000 -> uart
[    0.000000] fixed up name for test@100000 -> test
[    0.000000] fixed up name for virtio_mmio@10008000 -> virtio_mmio
[    0.000000] fixed up name for virtio_mmio@10007000 -> virtio_mmio
[    0.000000] fixed up name for virtio_mmio@10006000 -> virtio_mmio
[    0.000000] fixed up name for virtio_mmio@10005000 -> virtio_mmio
[    0.000000] fixed up name for virtio_mmio@10004000 -> virtio_mmio
[    0.000000] fixed up name for virtio_mmio@10003000 -> virtio_mmio
[    0.000000] fixed up name for virtio_mmio@10002000 -> virtio_mmio
[    0.000000] fixed up name for virtio_mmio@10001000 -> virtio_mmio
[    0.000000] fixed up name for cpus -> cpus
[    0.000000] fixed up name for cpu@0 -> cpu
[    0.000000] fixed up name for interrupt-controller -> interrupt-controller
[    0.000000] fixed up name for memory@80000000 -> memory
[    0.000000] fixed up name for soc -> soc
[    0.000000] fixed up name for pci@30000000 -> pci
[    0.000000] fixed up name for interrupt-controller@c000000 -> interrupt-controller
[    0.000000] fixed up name for clint@2000000 -> clint
[    0.000000]  <- unflatten_device_tree()
[    0.000000] software IO TLB: mapped [mem 0xbb1fc000-0xbf1fc000] (64MB)
[    0.000000] 0 ffffffe03effc808 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effca78 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effcd98 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd068 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd230 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd4b8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd740 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd9c8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effdc50 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effded8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe160 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe3e8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe670 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe888 [cpu] | [cpu]
[    0.000000] ffffffe03effe888 ffffffe03effec00 [<NULL>] | [cpu]
[    0.000000] ffffffe03effe888 ffffffe03effeee8 [memory] | [cpu]
[    0.000000] ffffffe03effe888 ffffffe03efff0b0 [<NULL>] | [cpu]
[    0.000000] ffffffe03effe888 ffffffe03efff320 [pci] | [cpu]
[    0.000000] ffffffe03effe888 ffffffe03efff858 [<NULL>] | [cpu]
[    0.000000] ffffffe03effe888 ffffffe03efffd58 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effc808 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effca78 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effcd98 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd068 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd230 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd4b8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd740 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd9c8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effdc50 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effded8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe160 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe3e8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe670 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe888 [cpu] | [cpu]
[    0.000000] elf_hwcap is 0x112d
[    0.000000] percpu: Embedded 17 pages/cpu @(____ptrval____) s29400 r8192 d32040 u69632
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 258055
[    0.000000] Kernel command line: earlyprintk
[    0.000000] Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
[    0.000000] Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)
[    0.000000] Sorting __ex_table...
[    0.000000] Memory: 949716K/1046528K available (6565K kernel code, 342K rwdata, 2564K rodata, 208K init, 832K bss, 96812K reserved, 0K cma-reserved)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] rcu: Hierarchical RCU implementation.
[    0.000000] rcu:     RCU event tracing is enabled.
[    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1.
[    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
[    0.000000] NR_IRQS: 0, nr_irqs: 0, preallocated irqs: 0
[    0.000000] plic: mapped 53 interrupts to 2 (out of 2) handlers.
[    0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x24e6a1710, max_idle_ns: 440795202120 ns
[    0.000000] Console: colour dummy device 80x25
[    0.000000] console [tty0] enabled
[    0.000000] bootconsole [early0] disabled
[    0.000000] HART = 0 DTB = 80e00000
[    0.000000] search "chosen", depth: 0, uname:
[    0.000000] search "chosen", depth: 1, uname: chosen
[    0.000000] Looking for initrd properties...
[    0.000000] initrd_start=0x88000000  initrd_end=0x88442b86
[    0.000000] Command line is: earlyprintk
[    0.000000] dt_root_size_cells = 2
[    0.000000] dt_root_addr_cells = 2
[    0.000000] memory scan node memory@80000000, reg size 16,
[    0.000000]  - 80000000 ,  40000000
[    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[    0.000000] Linux version 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP Sat Jul 6 12:14:41 MSK 2019
[    0.000000] bootconsole [early0] enabled
[    0.000000] Initial ramdisk at: 0x(____ptrval____) (4467590 bytes)
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000]   Normal   [mem 0x00000000c0000000-0x00000bffffffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] INITIAL: ffffffe000c00000
[    0.000000]  -> unflatten_device_tree()
[    0.000000] Unflattening device tree:
[    0.000000] magic: d00dfeed
[    0.000000] size: 00000d56
[    0.000000] version: 00000011
[    0.000000]   size is 14192, allocating...
[    0.000000]   unflattening (____ptrval____)...
[    0.000000] fixed up name for  ->
[    0.000000] fixed up name for chosen -> chosen
[    0.000000] fixed up name for uart@10000000 -> uart
[    0.000000] fixed up name for test@100000 -> test
[    0.000000] fixed up name for virtio_mmio@10008000 -> virtio_mmio
[    0.000000] fixed up name for virtio_mmio@10007000 -> virtio_mmio
[    0.000000] fixed up name for virtio_mmio@10006000 -> virtio_mmio
[    0.000000] fixed up name for virtio_mmio@10005000 -> virtio_mmio
[    0.000000] fixed up name for virtio_mmio@10004000 -> virtio_mmio
[    0.000000] fixed up name for virtio_mmio@10003000 -> virtio_mmio
[    0.000000] fixed up name for virtio_mmio@10002000 -> virtio_mmio
[    0.000000] fixed up name for virtio_mmio@10001000 -> virtio_mmio
[    0.000000] fixed up name for cpus -> cpus
[    0.000000] fixed up name for cpu@0 -> cpu
[    0.000000] fixed up name for interrupt-controller -> interrupt-controller
[    0.000000] fixed up name for memory@80000000 -> memory
[    0.000000] fixed up name for soc -> soc
[    0.000000] fixed up name for pci@30000000 -> pci
[    0.000000] fixed up name for interrupt-controller@c000000 -> interrupt-controller
[    0.000000] fixed up name for clint@2000000 -> clint
[    0.000000]  <- unflatten_device_tree()
[    0.000000] software IO TLB: mapped [mem 0xbb1fc000-0xbf1fc000] (64MB)
[    0.000000] 0 ffffffe03effc808 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effca78 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effcd98 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd068 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd230 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd4b8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd740 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd9c8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effdc50 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effded8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe160 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe3e8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe670 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe888 [cpu] | [cpu]
[    0.000000] ffffffe03effe888 ffffffe03effec00 [<NULL>] | [cpu]
[    0.000000] ffffffe03effe888 ffffffe03effeee8 [memory] | [cpu]
[    0.000000] ffffffe03effe888 ffffffe03efff0b0 [<NULL>] | [cpu]
[    0.000000] ffffffe03effe888 ffffffe03efff320 [pci] | [cpu]
[    0.000000] ffffffe03effe888 ffffffe03efff858 [<NULL>] | [cpu]
[    0.000000] ffffffe03effe888 ffffffe03efffd58 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effc808 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effca78 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effcd98 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd068 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd230 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd4b8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd740 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effd9c8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effdc50 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effded8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe160 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe3e8 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe670 [<NULL>] | [cpu]
[    0.000000] 0 ffffffe03effe888 [cpu] | [cpu]
[    0.000000] elf_hwcap is 0x112d
[    0.000000] percpu: Embedded 17 pages/cpu @(____ptrval____) s29400 r8192 d32040 u69632
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 258055
[    0.000000] Kernel command line: earlyprintk
[    0.000000] Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
[    0.000000] Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)
[    0.000000] Sorting __ex_table...
[    0.000000] Memory: 949716K/1046528K available (6565K kernel code, 342K rwdata, 2564K rodata, 208K init, 832K bss, 96812K reserved, 0K cma-reserved)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] rcu: Hierarchical RCU implementation.
[    0.000000] rcu:     RCU event tracing is enabled.
[    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1.
[    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
[    0.000000] NR_IRQS: 0, nr_irqs: 0, preallocated irqs: 0
[    0.000000] plic: mapped 53 interrupts to 2 (out of 2) handlers.
[    0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x24e6a1710, max_idle_ns: 440795202120 ns
[    0.000000] Console: colour dummy device 80x25
[    0.000000] console [tty0] enabled
[    0.000000] bootconsole [early0] disabled
[    0.000000] Calibrating delay loop (skipped), value calculated using timer frequency.. 20.00 BogoMIPS (lpj=100000)
[    0.000000] pid_max: default: 32768 minimum: 301
[    0.000000] Mount-cache hash table entries: 2048 (order: 2, 16384 bytes)
[    0.000000] Mountpoint-cache hash table entries: 2048 (order: 2, 16384 bytes)
[    0.020000] rcu: Hierarchical SRCU implementation.
[    0.020000] smp: Bringing up secondary CPUs ...
[    0.020000] smp: Brought up 1 node, 1 CPU
[    0.050000] devtmpfs: initialized
[    0.050000] 0 ffffffe03effc808 [<NULL>] | [cpu]
[    0.050000] 0 ffffffe03effca78 [<NULL>] | [cpu]
[    0.050000] 0 ffffffe03effcd98 [<NULL>] | [cpu]
[    0.050000] 0 ffffffe03effd068 [<NULL>] | [cpu]
[    0.050000] 0 ffffffe03effd230 [<NULL>] | [cpu]
[    0.050000] 0 ffffffe03effd4b8 [<NULL>] | [cpu]
[    0.050000] 0 ffffffe03effd740 [<NULL>] | [cpu]
[    0.050000] 0 ffffffe03effd9c8 [<NULL>] | [cpu]
[    0.050000] 0 ffffffe03effdc50 [<NULL>] | [cpu]
[    0.050000] 0 ffffffe03effded8 [<NULL>] | [cpu]
[    0.050000] 0 ffffffe03effe160 [<NULL>] | [cpu]
[    0.050000] 0 ffffffe03effe3e8 [<NULL>] | [cpu]
[    0.050000] 0 ffffffe03effe670 [<NULL>] | [cpu]
[    0.050000] 0 ffffffe03effe888 [cpu] | [cpu]
[    0.050000] random: get_random_u32 called from bucket_table_alloc+0x76/0x17a with crng_init=0
[    0.050000] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.050000] futex hash table entries: 256 (order: 2, 16384 bytes)
[    0.060000] NET: Registered protocol family 16
[    0.090000] vgaarb: loaded
[    0.090000] SCSI subsystem initialized
[    0.090000] usbcore: registered new interface driver usbfs
[    0.090000] usbcore: registered new interface driver hub
[    0.090000] usbcore: registered new device driver usb
[    0.090000] pps_core: LinuxPPS API ver. 1 registered
[    0.090000] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    0.090000] PTP clock support registered
[    0.100000] Advanced Linux Sound Architecture Driver Initialized.
[    0.100000] clocksource: Switched to clocksource riscv_clocksource
[    0.110000] NET: Registered protocol family 2
[    0.110000] tcp_listen_portaddr_hash hash table entries: 512 (order: 1, 8192 bytes)
[    0.110000] TCP established hash table entries: 8192 (order: 4, 65536 bytes)
[    0.110000] TCP bind hash table entries: 8192 (order: 5, 131072 bytes)
[    0.110000] TCP: Hash tables configured (established 8192 bind 8192)
[    0.110000] UDP hash table entries: 512 (order: 2, 16384 bytes)
[    0.110000] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
[    0.110000] NET: Registered protocol family 1
[    0.120000] Unpacking initramfs...
[    0.590000] workingset: timestamp_bits=62 max_order=18 bucket_order=0
[    0.620000] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251)
[    0.620000] io scheduler noop registered
[    0.620000] io scheduler deadline registered
[    0.620000] io scheduler cfq registered (default)
[    0.620000] io scheduler mq-deadline registered
[    0.620000] io scheduler kyber registered
[    0.620000] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4
[    0.690000] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[    0.690000] 10000000.uart: ttyS0 at MMIO 0x10000000 (irq = 10, base_baud = 230400) is a 16550A
[    0.720000] console [ttyS0] enabled
[    0.720000] [drm] radeon kernel modesetting enabled.
[    0.720000] [drm] amdgpu kernel modesetting enabled.
[    0.730000] loop: module loaded
[    0.730000] libphy: Fixed MDIO Bus: probed
[    0.740000] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
[    0.740000] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[    0.740000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    0.740000] ehci-pci: EHCI PCI platform driver
[    0.740000] ehci-platform: EHCI generic platform driver
[    0.740000] mousedev: PS/2 mouse device common for all mice
[    0.740000] usbcore: registered new interface driver usbhid
[    0.740000] usbhid: USB HID core driver
[    0.740000] usbcore: registered new interface driver snd-usb-audio
[    0.740000] NET: Registered protocol family 10
[    0.750000] Segment Routing with IPv6
[    0.750000] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[    0.750000] NET: Registered protocol family 17
[    0.750000] Key type dns_resolver registered
[    0.760000] ALSA device list:
[    0.760000]   No soundcards found.
[    0.770000] Freeing unused kernel memory: 208K
[    0.770000] This architecture does not have kernel memory protection.
[    0.770000] Run /init as init process

(«Timestamped» lines are output by the kernel, while a tree outputs BBL in front of them) On one hand, FDT is read successfully, on the other hand, it results in some nonsense in the parsed «object» tree.

During debugging, I realized that BBL could not read the «double» address not because there was an error in the config, but simply because the root node was set. #address-cells = <1>; #size-cells = <1>;.

By expanding the debug output, I saw that pointers to type dhe emri had «messed up» in a rather strange way: their first (starting from zero) byte was zeroed out, something like 0xabcdef -> 0xab00ef.I had to use a familiar tactic: knowing the addresses where the damaged memory was located, I wrote in the function printk to print this data. And also scatter the calls printk where they are few. Unfortunately, it didn't become significantly clearer. Then I began, checking with the disassembled objdump version, to manually place breakpoints and step through the problematic section of code. And here a mysterious and unpleasant thing was discovered: if you immediately set a breakpoint somewhere relatively far from the known-good state, then, stopping there, I would see already damaged memory. But if I tried to quietly sneak up to it step by step, the error manages to hide! This points to a broken memory controller and a cache hiding the error when constantly requesting the needed value. What if...

Replacing the memory

Clinging to the opportunity to solve the problem not on my end, I assumed that maybe I simply got a bad memory stick. I remembered that a decade-old netbook is not only a portable computer but also a valuable source of DDR2 SO-DIMM. As a bonus, you can insert the memory removed from the board and get almost instantaneous Memtest hanging (Linux, by the way, managed to boot almost to the graphical interface). But it's better not to repeat such an experiment if you value the information on the mounted disks...). On one hand, it can be assumed that simply the memory did not fit this specific netbook. On the other hand, it was able to boot! There was hope that the memory was simply “bad” and the problem was not in my wrapper.

Therefore, I need to try temporarily booting with the netbook’s memory. Unfortunately, Quartus 18 does not allow upgrading this IP Core to make it editable. Thus, it seems that the time has come to learn how to create new instances. It turned out to be quite simple: we look for the DDR2 SDRAM Controller with ALTMEMPHY Intel FPGA IP in the IP Catalog and get a block with the same interface as before. The only problem is to set the correct memory settings.

Obtaining memory module parameters

There is a relatively obvious way to configure the module: read the parameters from SPD. Indeed, if an ordinary computer reads SPD data and configures the controller based on them, let's read this data on the available netbook and fill them into a table.

On Ubuntu, this is done rather simply: you need to install the package i2c-tools, load the modules eeprom dhe i2c-i801 (I’m not sure the second driver will fit everywhere), after which run decode-dimms.:

Output of decode-dimms

# decode-dimms version 6231 (2014-02-20 10:54:34 +0100)

Memory Serial Presence Detect Decoder
By Philip Edelbrock, Christian Zuckschwerdt, Burkart Lingner,
Jean Delvare, Trent Piepho and others

Decoding EEPROM: /sys/bus/i2c/drivers/eeprom/0-0050
Guessing DIMM is in                             bank 1

---=== SPD EEPROM Information ===---
EEPROM Checksum of bytes 0-62                   OK (0x00)
SPD Revision                                    Invalid
Fundamental Memory type                         Unknown (0x00)

---=== Manufacturing Information ===---
Manufacturer                                    Undefined
Part Number                                     Undefined

Decoding EEPROM: /sys/bus/i2c/drivers/eeprom/4-0050
Guessing DIMM is in                             bank 1

---=== SPD EEPROM Information ===---
EEPROM Checksum of bytes 0-62                   OK (0x00)
SPD Revision                                    Invalid
Fundamental Memory type                         Unknown (0x00)

---=== Manufacturing Information ===---
Manufacturer                                    Undefined
Part Number                                     Undefined

Decoding EEPROM: /sys/bus/i2c/drivers/eeprom/6-0050
Guessing DIMM is in                             bank 1

---=== SPD EEPROM Information ===---
EEPROM Checksum of bytes 0-62                   OK (0x76)
# of bytes written to SDRAM EEPROM              128
Total number of bytes in EEPROM                 256
Fundamental Memory type                         DDR2 SDRAM
SPD Revision                                    1.2

---=== Memory Characteristics ===---
Maximum module speed                            800 MHz (PC2-6400)
Size                                            1024 MB
Banks x Rows x Columns x Bits                   8 x 13 x 10 x 64
Ranks                                           2
SDRAM Device Width                              16 bits
Module Height                                   30.0 mm
Module Type                                     SO-DIMM (67.6 mm)
DRAM Package                                    Planar
Voltage Interface Level                         SSTL 1.8V
Module Configuration Type                       No Parity
Refresh Rate                                    Reduced (7.8 us) - Self Refresh
Supported Burst Lengths                         4, 8
tCL-tRCD-tRP-tRAS                               6-6-6-18
Supported CAS Latencies (tCL)                   6T, 5T, 4T
Minimum Cycle Time                              2.50 ns at CAS 6 (tCK min)
                                                3.00 ns at CAS 5
                                                3.75 ns at CAS 4
Maximum Access Time                             0.40 ns at CAS 6 (tAC)
                                                0.45 ns at CAS 5
                                                0.50 ns at CAS 4
Maximum Cycle Time (tCK max)                    8.00 ns

---=== Timing Parameters ===---
Address/Command Setup Time Before Clock (tIS)   0.17 ns
Address/Command Hold Time After Clock (tIH)     0.25 ns
Data Input Setup Time Before Strobe (tDS)       0.05 ns
Data Input Hold Time After Strobe (tDH)         0.12 ns
Minimum Row Precharge Delay (tRP)               15.00 ns
Minimum Row Active to Row Active Delay (tRRD)   10.00 ns
Minimum RAS# to CAS# Delay (tRCD)               15.00 ns
Minimum RAS# Pulse Width (tRAS)                 45.00 ns
Write Recovery Time (tWR)                       15.00 ns
Minimum Write to Read CMD Delay (tWTR)          7.50 ns
Minimum Read to Pre-charge CMD Delay (tRTP)     7.50 ns
Minimum Active to Auto-refresh Delay (tRC)      60.00 ns
Minimum Recovery Delay (tRFC)                   127.50 ns
Maximum DQS to DQ Skew (tDQSQ)                  0.20 ns
Maximum Read Data Hold Skew (tQHS)              0.30 ns

---=== Manufacturing Information ===---
Manufacturer                                    Samsung
Manufacturing Location Code                     0x02
Part Number                                     M4 70T2864QZ3-CF7
Revision Code                                   0x3351
Manufacturing Date                              2009-W34
Assembly Serial Number                          0x79C64E9A

Number of SDRAM DIMMs detected and decoded: 3

The problem is that some timings are not specified here, so we will go the second route.

What is written on the modules:

Pjesa 4: Fundja, ngarkojmë Linux në RocketChip RISC-VPjesa 4: Fundja, ngarkojmë Linux në RocketChip RISC-V

In this case, the interesting print is on the memory chips: K4T1G164QQ-HCF7. Plugging this line into Google, we get the datasheet with several dozen pages with all the necessary parameters, which can be carefully typed into the properties of the IP Core. Just pay attention to the units of measurement: somewhere ns, somewhere — ps, and sometimes even fractions tCK.I won’t teach you what to pay attention to — I configured many things by trial and error (I can't guarantee that it's impossible to ‘burn’ memory or FPGA this way). I will just point out this: I spent a long time trying to get the controller to work, and the last step was realizing that I needed to check the widths of all memory interfaces against the generated Verilog code: after all, when in MemIfBundle është nënvizuar val mem_ba = IO(Output(UInt(2.W))), and there are 8 banks (i.e., an address width of 3 bits), then everything we have — dangling output from the memory controller — is a problem, but not critical, so everything synthesizes but does not work.

Perhaps everything would work with the old module if the controller was updated, but for now, I’m too lazy to deal with potential floating bugs: I have enough of my own.

So, after moving timebase-frequency from the specific CPU level to the node level cpus (by the quite clear request of the kernel), we obtain:

Teksti i fshehur

[    0.000000] OF: fdt: Po zhdupe memorjes 0x80000000 - 0x80200000
[    0.000000] Linux version 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP Mar 9 22:42:36 MSK 2019
[    0.000000] bootconsole [early0] e mundur
[    0.000000] Rameja fillestare në: 0x(____ptrval____) (16777216 bytes)
[    0.000000] Zona e intervaleve:
[    0.000000]   DMA32    [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000]   Normale   [mem 0x00000000c0000000-0x00000bffffffffff]
[    0.000000] Zona e lëvizshme fillon për secilën nyjë
[    0.000000] Intervalet e nyjave fillestare në memorie
[    0.000000]   nyja   0: [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] Setup i memorie fillestare nyja 0 [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] TLB softuerike IO: e mapuar [mem 0xbb1fc000-0xbf1fc000] (64MB)
[    0.000000] elf_hwcap është 0x112d
[    0.000000] percpu: Embedded 17 faqesh/cpu @(____ptrval____) s29400 r8192 d32040 u69632
[    0.000000] Ndërtuar 1 listazhe zonash, grupimi i lëvizshmërisë aktiv. Numri total i faqeve: 258055
[    0.000000] Urdhri i komandës së kernelit: debug console=ttySIF0,125200 root=/dev/mmcblk0p2 loglevel=7 rootwait
[    0.000000] Dentry cache hash tabela e elementeve: 131072 (renditja: 8, 1048576 bytes)
[    0.000000] Inode-cache hash tabela e elementeve: 65536 (renditja: 7, 524288 bytes)
[    0.000000] Sortezimi __ex_table...
[    0.000000] Memoria: 937696K/1046528K e disponueshme (6565K kod kernel, 343K rwdata, 2564K rodata, 208K fillestar, 832K bss, 108832K e rezervuar, 0K e rezervuar cma)
[    0.000000] SLUB: HWalign=64, Rendi=0-3, ObjekteMin=0, CPU=1, Nyje=1
[    0.000000] rcu: Implementimi hierarkik i RCU.
[    0.000000] rcu:     RCU ndodhet e aktivizuar.
[    0.000000] rcu:     RCU po kufizon CPU nga NR_CPUS=8 në nr_cpu_ids=1.
[    0.000000] rcu: Adjustimi i gjeometrisë për rcu_fanout_leaf=16, nr_cpu_ids=1
[    0.000000] NR_IRQS: 0, nr_irqs: 0, irqs të paracaktuar: 0
[    0.000000] plic: e mapuar 8 ndërprerje në 1 (nga 2) menaxherë.
[    0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 3526361616960 ns
[    0.000000] Konsola: pajisje dummy të ngjyrave 80x25
[    0.000000] Kalibrimi i cikli të vonesës (u anashkalua), vlera e llogaritur duke përdorur frekuencën e orës.. 2.00 BogoMIPS (lpj=10000)
[    0.020000] pid_max: e paracaktuar: 32768 minimum: 301
[    0.030000] Tabela e hashit për cache-pjesë të montuar: 2048 (renditja: 2, 16384 bytes)
[    0.040000] Tabela e hashit për cache-pjesë të montuara: 2048 (renditja: 2, 16384 bytes)
[    0.140000] rcu: Implementimi hierarkik SRCU.
[    0.190000] smp: Aktivizimi i CPU-ve sekondarë ...
[    0.190000] smp: Aktivizimi i 1 nyje, 1 CPU
[    0.220000] devtmpfs: e inicializuar
[    0.300000] random: get_random_u32 e thirri nga bucket_table_alloc+0x76/0x17a me crng_init=0
[    0.330000] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.340000] futex hash tabela e elementeve: 256 (renditja: 2, 16384 bytes)
[    0.380000] NET: Familja e protokollit 16 e regjistruar
[    1.850000] vgaarb: e ngarkuar
[    1.870000] SCSI nënshkroni e inicializuar
[    1.900000] usbcore: regjistruar drejtues të ri të ndërfaqeve usbfs
[    1.910000] usbcore: regjistruar drejtues të rinj për qendra
[    1.920000] usbcore: regjistruar drejtues të rinj për pajisje usb
[    1.930000] pps_core: API LinuxPPS ver. 1 e regjistruar
[    1.940000] pps_core: Softueri ver. 5.3.6 - Kopje 2005-2007 Rodolfo Giometti 
[    1.950000] PTP mbështetje e regjistruar
[    1.970000] Avancuar Arkitektura e Zërit Linux drejtuesi e inicializuar.
[    2.010000] clocksource: Kalimi në clocksource riscv_clocksource
[    2.600000] NET: Familja e protokollit 2 e regjistruar
[    2.640000] tcp_listen_portaddr_hash tabela e hashit të elementeve: 512 (renditja: 1, 8192 bytes)
[    2.650000] TCP tabela e hashit të elementeve të krijuara: 8192 (renditja: 4, 65536 bytes)
[    2.670000] TCP tabela e hashit të elementeve të lidhura: 8192 (renditja: 5, 131072 bytes)
[    2.700000] TCP: Tabelat e hashit të konfiguruara (të krijuara 8192 të lidhura 8192)
[    2.720000] UDP tabela e hashit të elementeve: 512 (renditja: 2, 16384 bytes)
[    2.730000] UDP-Lite tabela e hashit: 512 (renditja: 2, 16384 bytes)
[    2.750000] NET: Familja e protokollit 1 e regjistruar
[    2.770000] Zbërthimi i initramfs...
[   23.980000] Zbërthimi i initramfs dështoi: mbeturina në arkiv të kompresuar
[   24.030000] workingset: timestamp_bits=62 max_order=18 bucket_order=0
[   25.020000] Shtresa bllokuese SCSI e përgjithshme (bsg) drejtues versioni 0.4 e ngarkuar (major 251)
[   25.030000] planifikuesi i IO noop i regjistruar
[   25.040000] planifikuesi i IO deadline i regjistruar
[   25.050000] planifikuesi i IO cfq i regjistruar (default)
[   25.060000] planifikuesi i IO mq-deadline i regjistruar
[   25.060000] planifikuesi i IO kyber i regjistruar
[   25.120000] sifive_gpio 64002000.gpio: Chipi i GPIO SiFive u regjistrua 6 GPIOs
[   25.150000] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4
[   28.870000] Serial: drejtues 8250/16550, 4 porte, ndarja e IRQ e çaktivizuar
[   28.940000] sifive-serial 64000000.serial: nuk arriti të gjejë orën e kontrollit
[   28.950000] sifive-serial: prova e 64000000.serial dështoi me gabim -2
[   28.980000] [drm] radeon mbështetje e mënyrës kernel aktivizuar.
[   28.990000] [drm] amdgpu mbështetje e mënyrës kernel aktivizuar.
[   29.500000] loop: moduli u ngarkua
[   29.610000] sifive_spi 64001000.spi: Nuk arriti të gjejë orën e autobusit
[   29.620000] sifive_spi: prova e 64001000.spi dështoi me gabim -2
[   29.640000] libphy: MBus i Fixuar: u provua
[   29.680000] e1000e: Intel(R) PRO/1000 Drejtuesi i Rjetit - 3.2.6-k
[   29.690000] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[   29.700000] ehci_hcd: USB 2.0 'Përmirësuar' Drejtuesi i Hostit (EHCI)
[   29.710000] ehci-pci: drejtuesi platformë EHCI PCI
[   29.720000] ehci-platform: drejtues i përgjithshëm platformë EHCI
[   29.750000] mousedev: pajisja PS/2 e miut e zakonshme për të gjithë miun
[   29.790000] usbcore: regjistruar drejtues të rinj të ndërfaqeve usbhid
[   29.800000] usbhid: drejtuesi bazë USB HID
[   29.820000] usbcore: regjistruar drejtues të rinj të audios USB
[   29.900000] NET: Familja e protokollit 10 e regjistruar
[   29.960000] Segment Ruting me IPv6
[   29.960000] sit: IPv6, IPv4 dhe MPLS mbi IPv4 drejtues tunneling
[   30.020000] NET: Familja e protokollit 17 e regjistruar
[   30.020000] Lloji i regjistruar dns_resolver
[   30.070000] bootconsole [early0] përdor memorie fillestare dhe duhet të çaktivizohet edhe përpara se e vërteta të jetë gati
[   30.080000] bootconsole [early0] u çaktivizua

Pasi asgjë e dukshme nuk ndodh.

Tani mund të provoni të përballeni me tre probleme:

[   23.980000] Zbërthimi i initramfs dështoi: mbeturina në arkiv të kompresuar
...
[   28.940000] sifive-serial 64000000.serial: nuk arriti të gjejë orën e kontrollit
...
[   29.610000] sifive_spi 64001000.spi: Nuk arriti të gjejë orën e autobusit

… si dhe me ndalimin e të dhënave në konsolë.

Me dy probleme me frekuencat, përballja nuk është e vështirë: thjesht duhet të shtoni pika clocks në nëndarjet e kërkuara, duke i dhënë një emër kuptimplotë etiketës për nyjën tlclk:

diff --git a/arch/riscv/dts/zeowaa-1gb.dts b/arch/riscv/dts/zeowaa-1gb.dts
index 4b2cebc..1347e76 100644
--- a/arch/riscv/dts/zeowaa-1gb.dts
+++ b/arch/riscv/dts/zeowaa-1gb.dts
@@ -96,6 +97,7 @@
                 L8: serial@64000000 {
                         compatible = "sifive,uart0";
                         interrupt-parent = ;
+                        clocks = ;
                         interrupts = ;
                         reg = ;
                         reg-names = "control";
@@ -107,6 +109,7 @@
                         interrupt-parent = ;
                         interrupts = ;
                         reg = ;
+                        clocks = ;
                         reg-names = "control";
                         L12: mmc@0 {
                                 compatible = "mmc-spi-slot";
@@ -116,7 +119,7 @@
                                 voltage-ranges = ;
                         };
                 };
-                L11: tlclk {
+                tlclk: tlclk {
                         #clock-cells = ;
                         clock-frequency = ;
                         clock-output-names = "tlclk";

Shtuar këtij rreshti #define pr_debug printk në fillim të skedarit init/initramfs.c, duke shfaqur një mesazh për plehra në vend të initramfs ne marrim një mesazh pak më të detajuar:

[    2.760000] Zbërthimi i initramfs...
[    2.770000] Dëgjuar të dhëna të ngjeshura gzip
[   23.940000] Dëgjuar të dhëna të ngjeshura (null)
[   23.970000] Zbërthimi i initramfs dështoi: plehra në arkiv të ngjeshur

Që dmth, ndoshta, plehra nuk është në vend të initramfs, por bashkë.

Ok, ndoshta ka gjetur diçka, ndoshta kjo është e mjaftueshme. Por ku u zhduk konsola? Kërkimi jep një lidhje me çështjen në GitHub: linux i dështoi të ngjitet në bordin vc707 — duket se një UART për driver-in nuk është temë diskutimi. Por korrigjimin daton 11 korrik 2018 — një vit më parë. Doli se ky commit nuk ka arritur në pemën nga e cila ndërtohet bërthama ime. Duke e aplikuar manualisht këtë patch, arrita të bëj të punojë Linux! Doli se problemi me initramfs që kishte, në fakt, nuk ishte kritik.

Pasi u identifikova si user=root, password=sifive, arrita pa probleme të mëdha (përveç kuptimit se numri i GPIO ka një bazë, nga e cila llogaritet gjithçka, dhe që thjesht duhet të lexoj nga skedari përkatës pseudo) përmes sysfs ndriçimin e dritës në bord.

Si dhe herën e kaluar, po bashkëngjit një video tekstuale të nisjes së Linux. Në momentin e kalimit të konsolës nga earlyprintk në atë standard, ka një plehra, e cila i ngjan daljes me shpejtësi të gabuar të UART. E çuditshme, por player-i e përpunoi këtë "të papastër".

Pjesa 4: Fundja, ngarkojmë Linux në RocketChip RISC-V

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster