Index: sys/arm/arm/platform.c =================================================================== --- sys/arm/arm/platform.c +++ sys/arm/arm/platform.c @@ -177,3 +177,18 @@ PLATFORM_LATE_INIT(plat_obj); } +#if defined(SMP) && defined(PLATFORM_SMP) +void +platform_mp_setmaxid(void) +{ + + PLATFORM_MP_SETMAXID(plat_obj); +} + +void +platform_mp_start_ap(void) +{ + + PLATFORM_MP_START_AP(plat_obj); +} +#endif Index: sys/arm/arm/platform_if.m =================================================================== --- sys/arm/arm/platform_if.m +++ sys/arm/arm/platform_if.m @@ -27,11 +27,13 @@ # #include +#include #include #include #include #include +#include #include #include #include @@ -57,6 +59,12 @@ { return; } + + static void platform_default_mp_setmaxid(platform_t plat) + { + mp_ncpus = 1; + mp_maxid = 0; + } }; /** @@ -114,3 +122,16 @@ platform_t _plat; }; +/** + * @brief Called by cpu_mp_setmaxid() to set mp_maxid and mp_ncpus. + */ +METHOD void mp_setmaxid { + platform_t _plat; +} DEFAULT platform_default_mp_setmaxid; + +/** + * @brief Called by cpu_mp_start to start the secondary processors. + */ +METHOD void mp_start_ap { + platform_t _plat; +}; Index: sys/arm/conf/VIRT =================================================================== --- sys/arm/conf/VIRT +++ sys/arm/conf/VIRT @@ -26,6 +26,7 @@ options HZ=100 options SCHED_ULE # 4BSD scheduler options PLATFORM +options PLATFORM_SMP options SMP # Enable multiple cores # Debugging for use in -current Index: sys/arm/qemu/virt_machdep.c =================================================================== --- sys/arm/qemu/virt_machdep.c +++ sys/arm/qemu/virt_machdep.c @@ -41,6 +41,8 @@ #include #include +#include + #include "platform_if.h" struct arm32_dma_range * @@ -86,6 +88,11 @@ PLATFORMMETHOD(platform_devmap_init, virt_devmap_init), PLATFORMMETHOD(platform_lastaddr, virt_lastaddr), +#ifdef SMP + PLATFORMMETHOD(platform_mp_start_ap, virt_mp_start_ap), + PLATFORMMETHOD(platform_mp_setmaxid, virt_mp_setmaxid), +#endif + PLATFORMMETHOD_END, }; Index: sys/arm/qemu/virt_mp.h =================================================================== --- sys/arm/qemu/virt_mp.h +++ sys/arm/qemu/virt_mp.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2015 Andrew Turner + * Copyright (c) 2016 Andrew Turner * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,68 +25,10 @@ * */ -#include "opt_platform.h" +#ifndef _QEMU_VIRT_MP_H_ +#define _QEMU_VIRT_MP_H_ -#include -__FBSDID("$FreeBSD$"); +void virt_mp_start_ap(platform_t plat); +void virt_mp_setmaxid(platform_t plat); -#define _ARM32_BUS_DMA_PRIVATE -#include -#include - -#include - -#include -#include -#include -#include - -#include "platform_if.h" - -struct arm32_dma_range * -bus_dma_get_range(void) -{ - - return (NULL); -} - -int -bus_dma_get_range_nb(void) -{ - - return (0); -} - -void -cpu_reset(void) -{ - - while (1); -} - -static vm_offset_t -virt_lastaddr(platform_t plat) -{ - - return (arm_devmap_lastaddr()); -} - -/* - * Set up static device mappings. - */ -static int -virt_devmap_init(platform_t plat) -{ - - arm_devmap_add_entry(0x09000000, 0x100000); /* Uart */ - return (0); -} - -static platform_method_t virt_methods[] = { - PLATFORMMETHOD(platform_devmap_init, virt_devmap_init), - PLATFORMMETHOD(platform_lastaddr, virt_lastaddr), - - PLATFORMMETHOD_END, -}; - -FDT_PLATFORM_DEF(virt, "virt", 0, "linux,dummy-virt"); +#endif /* _QEMU_VIRT_MP_H_ */ Index: sys/arm/qemu/virt_mp.c =================================================================== --- sys/arm/qemu/virt_mp.c +++ sys/arm/qemu/virt_mp.c @@ -38,12 +38,15 @@ #include #include +#include #include #include #include #include +#include + static int running_cpus; int @@ -64,7 +67,7 @@ } void -platform_mp_setmaxid(void) +virt_mp_setmaxid(platform_t plat) { mp_maxid = PCPU_GET(cpuid); @@ -92,7 +95,7 @@ } void -platform_mp_start_ap(void) +virt_mp_start_ap(platform_t plat) { ofw_cpu_early_foreach(virt_start_ap, true); Index: sys/conf/options.arm =================================================================== --- sys/conf/options.arm +++ sys/conf/options.arm @@ -34,6 +34,7 @@ LOADERRAMADDR opt_global.h PHYSADDR opt_global.h PLATFORM opt_global.h +PLATFORM_SMP opt_global.h SOCDEV_PA opt_global.h SOCDEV_VA opt_global.h PV_STATS opt_pmap.h