Procházet zdrojové kódy

[bsp/qemu-virt64-aarch64] 增加smp支持

wangxiaoyao před 3 roky
rodič
revize
7d3afda7a4

+ 17 - 1
bsp/qemu-virt64-aarch64/drivers/board.c

@@ -20,6 +20,12 @@
 #endif
 #endif
 #include "board.h"
 #include "board.h"
 
 
+#ifdef RT_USING_FDT
+#include "interrupt.h"
+#include "dtb_node.h"
+#include <cpu.h>
+#endif
+
 #ifdef RT_USING_USERSPACE
 #ifdef RT_USING_USERSPACE
 struct mem_desc platform_mem_desc[] = {
 struct mem_desc platform_mem_desc[] = {
     {KERNEL_VADDR_START, KERNEL_VADDR_START + 0x0fffffff, KERNEL_VADDR_START + PV_OFFSET, NORMAL_MEM}
     {KERNEL_VADDR_START, KERNEL_VADDR_START + 0x0fffffff, KERNEL_VADDR_START + PV_OFFSET, NORMAL_MEM}
@@ -74,9 +80,19 @@ void rt_hw_board_init(void)
     /* initialize system heap */
     /* initialize system heap */
     rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
     rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
 
 
-    rt_components_board_init();
+    /* support debug feature before components init */
+    rt_hw_uart_init();
     rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
     rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
 
 
+#ifdef RT_USING_FDT
+    // TODO 0x44000000 should be replace by a variable
+    void * fdt_start = (void *)0x44000000 - PV_OFFSET;
+    device_tree_setup(fdt_start);
+    rt_hw_cpu_init();
+#endif
+
+    rt_components_board_init();
+
     rt_thread_idle_sethook(idle_wfi);
     rt_thread_idle_sethook(idle_wfi);
 
 
 #ifdef RT_USING_SMP
 #ifdef RT_USING_SMP

+ 3 - 1
bsp/qemu-virt64-aarch64/drivers/board.h

@@ -21,7 +21,7 @@ extern unsigned char __bss_end;
 
 
 #ifdef RT_USING_USERSPACE
 #ifdef RT_USING_USERSPACE
 #define HEAP_END    (rt_size_t)(KERNEL_VADDR_START + 64 * 1024 * 1024)
 #define HEAP_END    (rt_size_t)(KERNEL_VADDR_START + 64 * 1024 * 1024)
-#define PAGE_START  HEAP_END
+#define PAGE_START  HEAP_END + 1 * 1024 * 1024
 #define PAGE_END    ((rt_size_t)KERNEL_VADDR_START + 128 * 1024 * 1024)
 #define PAGE_END    ((rt_size_t)KERNEL_VADDR_START + 128 * 1024 * 1024)
 #else
 #else
 #define HEAP_END    ((void *)HEAP_BEGIN + 64 * 1024 * 1024)
 #define HEAP_END    ((void *)HEAP_BEGIN + 64 * 1024 * 1024)
@@ -29,4 +29,6 @@ extern unsigned char __bss_end;
 
 
 void rt_hw_board_init(void);
 void rt_hw_board_init(void);
 
 
+int rt_hw_uart_init(void);
+
 #endif
 #endif

+ 0 - 1
bsp/qemu-virt64-aarch64/drivers/drv_uart.c

@@ -141,4 +141,3 @@ int rt_hw_uart_init(void)
 
 
     return 0;
     return 0;
 }
 }
-INIT_BOARD_EXPORT(rt_hw_uart_init);

+ 36 - 0
bsp/qemu-virt64-aarch64/drivers/secondary_cpu.c

@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ */
+#include <rthw.h>
+#include <rtthread.h>
+#include <cpu.h>
+#include "gic.h"
+#include "interrupt.h"
+#include "mmu.h"
+
+#ifdef RT_USING_SMP
+
+extern unsigned long MMUTable[];
+
+void rt_hw_secondary_cpu_bsp_start(void)
+{
+    rt_hw_spin_lock(&_cpus_lock);
+
+    kernel_mmu_switch((unsigned long)MMUTable);
+
+    // interrupt init
+    rt_hw_vector_init();
+
+    arm_gic_cpu_init(0, 0);
+
+    // rt_hw_timers_init();
+
+    rt_system_scheduler_start();
+}
+
+#endif // SMP

+ 1 - 1
bsp/qemu-virt64-aarch64/qemu.sh

@@ -1,7 +1,7 @@
 if [ ! -f "sd.bin" ]; then
 if [ ! -f "sd.bin" ]; then
 dd if=/dev/zero of=sd.bin bs=1024 count=65536
 dd if=/dev/zero of=sd.bin bs=1024 count=65536
 fi
 fi
-qemu-system-aarch64 -M virt,gic-version=2 -cpu cortex-a53 -smp 4 -kernel rtthread.bin -nographic \
+qemu-system-aarch64 -M virt,gic-version=2,virtualization=on,secure=on -cpu cortex-a53 -smp 4 -kernel rtthread.bin -nographic
 -drive if=none,file=sd.bin,format=raw,id=blk0 -device virtio-blk-device,drive=blk0,bus=virtio-mmio-bus.0 \
 -drive if=none,file=sd.bin,format=raw,id=blk0 -device virtio-blk-device,drive=blk0,bus=virtio-mmio-bus.0 \
 -netdev user,id=net0 -device virtio-net-device,netdev=net0,bus=virtio-mmio-bus.1 \
 -netdev user,id=net0 -device virtio-net-device,netdev=net0,bus=virtio-mmio-bus.1 \
 -device virtio-serial-device -chardev socket,host=127.0.0.1,port=4321,server=on,wait=off,telnet=on,id=console0 -device virtserialport,chardev=console0
 -device virtio-serial-device -chardev socket,host=127.0.0.1,port=4321,server=on,wait=off,telnet=on,id=console0 -device virtserialport,chardev=console0

+ 5 - 0
bsp/qemu-virt64-aarch64/rtconfig.h

@@ -8,6 +8,8 @@
 
 
 #define RT_NAME_MAX 16
 #define RT_NAME_MAX 16
 #define RT_USING_SMART
 #define RT_USING_SMART
+#define RT_USING_SMP
+#define RT_CPUS_NR 4
 #define RT_ALIGN_SIZE 4
 #define RT_ALIGN_SIZE 4
 #define RT_THREAD_PRIORITY_32
 #define RT_THREAD_PRIORITY_32
 #define RT_THREAD_PRIORITY_MAX 32
 #define RT_THREAD_PRIORITY_MAX 32
@@ -17,6 +19,7 @@
 #define RT_USING_IDLE_HOOK
 #define RT_USING_IDLE_HOOK
 #define RT_IDLE_HOOK_LIST_SIZE 4
 #define RT_IDLE_HOOK_LIST_SIZE 4
 #define IDLE_THREAD_STACK_SIZE 8192
 #define IDLE_THREAD_STACK_SIZE 8192
+#define SYSTEM_THREAD_STACK_SIZE 8192
 #define RT_USING_TIMER_SOFT
 #define RT_USING_TIMER_SOFT
 #define RT_TIMER_THREAD_PRIO 4
 #define RT_TIMER_THREAD_PRIO 4
 #define RT_TIMER_THREAD_STACK_SIZE 8192
 #define RT_TIMER_THREAD_STACK_SIZE 8192
@@ -119,6 +122,8 @@
 #define RT_SERIAL_RB_BUFSZ 256
 #define RT_SERIAL_RB_BUFSZ 256
 #define RT_USING_TTY
 #define RT_USING_TTY
 #define RT_USING_PIN
 #define RT_USING_PIN
+#define RT_USING_FDT
+#define RT_USING_FDTLIB
 #define RT_USING_RTC
 #define RT_USING_RTC
 #define RT_USING_VIRTIO
 #define RT_USING_VIRTIO
 #define RT_USING_VIRTIO10
 #define RT_USING_VIRTIO10