Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Documentation/testing/ntfc.rst
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ CI runtime test cases use NTFC. Configurations with an NTFC runner include:
- :doc:`arm/imx6 </platforms/arm/imx6/index>`: ``sabre-6quad/citest``
- :doc:`arm64/qemu </platforms/arm64/qemu/boards/qemu-armv8a/index>`: ``qemu-armv8a/citest``
- :doc:`arm64/qemu </platforms/arm64/qemu/boards/qemu-armv8a/index>`: ``qemu-armv8a/citest_smp``
- :doc:`x86_64/qemu </platforms/x86_64/intel64/boards/qemu-intel64/index>`: ``qemu-intel64/citest_smp``

Running a CI Test Target Locally
================================
Expand Down
14 changes: 12 additions & 2 deletions arch/x86_64/src/intel64/intel64_hpet.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ static void intel64_hpet_cmpset(struct intel64_tim_dev_s *dev, uint8_t timer,
uint64_t cmp)
{
struct intel64_hpet_s *hpet = (struct intel64_hpet_s *)dev;

DEBUGASSERT(timer < hpet->timers);
intel64_hpet_putreg(hpet, HPET_TCOMP_OFFSET(timer), cmp);
}
Expand All @@ -239,6 +240,7 @@ static uint64_t intel64_hpet_cmpget(struct intel64_tim_dev_s *dev,
uint8_t timer)
{
struct intel64_hpet_s *hpet = (struct intel64_hpet_s *)dev;

DEBUGASSERT(timer < hpet->timers);
return intel64_hpet_getreg(hpet, HPET_TCOMP_OFFSET(timer));
}
Expand All @@ -255,6 +257,7 @@ static uint64_t intel64_hpet_intget(struct intel64_tim_dev_s *dev,
uint8_t timer)
{
struct intel64_hpet_s *hpet = (struct intel64_hpet_s *)dev;

return (intel64_hpet_getreg(hpet, HPET_GISR_OFFSET) &
HPET_GISR_TINT(timer));
}
Expand All @@ -271,6 +274,7 @@ static void intel64_hpet_intack(struct intel64_tim_dev_s *dev,
uint8_t timer)
{
struct intel64_hpet_s *hpet = (struct intel64_hpet_s *)dev;

intel64_hpet_putreg(hpet, HPET_GISR_OFFSET, HPET_GISR_TINT(timer));
}

Expand All @@ -285,6 +289,7 @@ static void intel64_hpet_intack(struct intel64_tim_dev_s *dev,
static uint64_t intel64_hpet_cntget(struct intel64_tim_dev_s *dev)
{
struct intel64_hpet_s *hpet = (struct intel64_hpet_s *)dev;

return intel64_hpet_getreg(hpet, HPET_MCNTR_OFFSET);
}

Expand All @@ -300,6 +305,7 @@ static void intel64_hpet_cntset(struct intel64_tim_dev_s *dev,
uint64_t cntr)
{
struct intel64_hpet_s *hpet = (struct intel64_hpet_s *)dev;

return intel64_hpet_putreg(hpet, HPET_MCNTR_OFFSET, cntr);
}

Expand All @@ -314,6 +320,7 @@ static void intel64_hpet_cntset(struct intel64_tim_dev_s *dev,
static uint32_t intel64_hpet_perget(struct intel64_tim_dev_s *dev)
{
struct intel64_hpet_s *hpet = (struct intel64_hpet_s *)dev;

return hpet->clk_per_fs;
}

Expand Down Expand Up @@ -383,9 +390,12 @@ static int intel64_hpet_setisr(struct intel64_tim_dev_s *dev, uint8_t timer,

if (handler == NULL)
{
/* Disable interrupt */
/* Disable the interrupt but keep the ISR attached. Detaching it here
* installs irq_unexpected_isr(), and an HPET interrupt that is already
* in flight to another CPU then panics the system. A stray interrupt
* is handled as spurious by the oneshot ISR instead.
*/

irq_attach(irq, handler, arg);
up_disable_irq(irq);
}
else
Expand Down
32 changes: 23 additions & 9 deletions arch/x86_64/src/intel64/intel64_oneshot.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,18 +100,21 @@ static int intel64_oneshot_handler(int irg_num, void * context, void *arg)
INTEL64_TIM_ACKINT(oneshot->tch, oneshot->chan);
#endif

/* The timer is no longer running */
/* The timer is no longer running. Only pick up the handler here;
* it is owned by intel64_oneshot_start()/cancel(), which may be
* re-arming the timer on another CPU right now. Clearing it from
* the ISR could leave a re-armed timer without a handler, and the
* next expiry would then jump through a NULL pointer.
*/

oneshot->running = false;

/* Forward the event, clearing out any vestiges */

oneshot_handler = (oneshot_handler_t)oneshot->handler;
oneshot->handler = NULL;
oneshot_arg = (void *)oneshot->arg;
oneshot->arg = NULL;

oneshot_handler(oneshot_arg);
if (oneshot_handler != NULL)
{
oneshot_handler(oneshot_arg);
}
}
else
{
Expand Down Expand Up @@ -301,10 +304,21 @@ int intel64_oneshot_start(struct intel64_oneshot_s *oneshot,
flags = spin_lock_irqsave(&g_oneshot_spin);
if (oneshot->running)
{
/* Yes.. then cancel it */
/* Yes.. then stop it. Do NOT call intel64_oneshot_cancel() here:
* it takes g_oneshot_spin, which we already hold, and spinlocks are
* not recursive, so that deadlocks the CPU. Everything else that
* cancel would do (ISR, comparator, interrupt enable) is
* reprogrammed below anyway.
*/

tmrinfo("Already running... cancelling\n");
intel64_oneshot_cancel(oneshot, NULL);

#ifndef CONFIG_INTEL64_HPET_FSB
INTEL64_TIM_DISABLEINT(oneshot->tch, oneshot->chan);
INTEL64_TIM_SETISR(oneshot->tch, oneshot->chan, NULL, NULL, false);
#endif

oneshot->running = false;
}

/* Save the new handler and its argument */
Expand Down
14 changes: 14 additions & 0 deletions boards/x86_64/qemu/qemu-intel64/configs/citest_smp/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
config:
cwd: './'

product:
name: "qemu-intel64"
cores:
core0:
name: 'main'
device: 'qemu'
exec_path: 'qemu-system-x86_64'
exec_args: '-m 2G -smp 4 -cpu max -nographic -serial mon:stdio'
uptime: 60
conf_path: './.config'
elf_path: './nuttx'
161 changes: 161 additions & 0 deletions boards/x86_64/qemu/qemu-intel64/configs/citest_smp/defconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_ARCH_INTEL64_HAVE_PCID is not set
# CONFIG_ARCH_X86_64_X2APIC is not set
CONFIG_16550_ADDRWIDTH=16
CONFIG_16550_PCI_UART1=y
CONFIG_16550_PCI_UART1_CLOCK=1843200
CONFIG_16550_PCI_UART1_DEVICE=0x0002
CONFIG_16550_PCI_UART1_VENDOR=0x1b36
CONFIG_16550_PCI_UART=y
CONFIG_16550_UART0=y
CONFIG_16550_UART0_BASE=0x3f8
CONFIG_16550_UART0_CLOCK=1843200
CONFIG_16550_UART0_IRQ=36
CONFIG_16550_UART0_RXBUFSIZE=16
CONFIG_16550_UART0_SERIAL_CONSOLE=y
CONFIG_16550_UART0_TXBUFSIZE=16
CONFIG_ALLOW_MIT_COMPONENTS=y
CONFIG_ARCH="x86_64"
CONFIG_ARCH_BOARD="qemu-intel64"
CONFIG_ARCH_BOARD_INTEL64_QEMU=y
CONFIG_ARCH_CHIP="qemu"
CONFIG_ARCH_CHIP_INTEL64_QEMU=y
CONFIG_ARCH_INTEL64_HPET_ALARM=y
CONFIG_ARCH_INTERRUPTSTACK=8192
CONFIG_ARCH_SETJMP_H=y
CONFIG_ARCH_SIZET_LONG=y
CONFIG_ARCH_X86_64=y
CONFIG_ARCH_X86_64_SSE3=y
CONFIG_ARCH_X86_64_SSE41=y
CONFIG_ARCH_X86_64_SSE42=y
CONFIG_ARCH_X86_64_SSE4A=y
CONFIG_ARCH_X86_64_SSSE3=y
CONFIG_BOARD_LOOPSPERMSEC=999
CONFIG_BOOT_RUNFROMEXTSRAM=y
CONFIG_BUILTIN=y
CONFIG_CM_MM_TEST=y
CONFIG_CM_MUTEX_TEST=y
CONFIG_CM_PTHREAD_TEST=y
CONFIG_CM_SCHED_TEST=y
CONFIG_CM_SOCKET_TEST=y
CONFIG_CM_TIME_TEST=y
CONFIG_CONSOLE_SYSLOG=y
CONFIG_DEBUG_FEATURES=y
CONFIG_DEBUG_PCI=y
CONFIG_DEBUG_PCI_ERROR=y
CONFIG_DEBUG_PCI_INFO=y
CONFIG_DEBUG_PCI_WARN=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_DEFAULT_TASK_STACKSIZE=4194304
CONFIG_DEV_SIMPLE_ADDRENV=y
CONFIG_EVENT_FD=y
CONFIG_EXAMPLES_HELLO=y
CONFIG_EXAMPLES_HIDKBD=y
CONFIG_EXAMPLES_PIPE=y
CONFIG_EXAMPLES_POPEN=y
CONFIG_FS_AIO=y
CONFIG_FS_FAT=y
CONFIG_FS_NAMED_SEMAPHORES=y
CONFIG_FS_NOTIFY=y
CONFIG_FS_PROCFS=y
CONFIG_FS_SHMFS=y
CONFIG_FS_TMPFS=y
CONFIG_HIDKBD_STACKSIZE=10240
CONFIG_HIDMOUSE_STACKSIZE=10240
CONFIG_IDLETHREAD_STACKSIZE=4194304
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_IOB_ALIGNMENT=64
CONFIG_IOB_BUFSIZE=2048
CONFIG_IOB_NBUFFERS=1024
CONFIG_IOB_NCHAINS=255
CONFIG_LIBC_LOCALE=y
CONFIG_LIBC_MEMFD_ERROR=y
CONFIG_LIBM=y
CONFIG_NET=y
CONFIG_NETDB_DNSCLIENT=y
CONFIG_NETDEV_LATEINIT=y
CONFIG_NETINIT_DRIPADDR=0xc0a80801
CONFIG_NETINIT_IPADDR=0x0a000102
CONFIG_NETUTILS_CODECS=y
CONFIG_NETUTILS_IPERF=y
CONFIG_NETUTILS_TELNETD=y
CONFIG_NETUTILS_TFTPC=y
CONFIG_NETUTILS_WEBCLIENT=y
CONFIG_NET_BROADCAST=y
CONFIG_NET_E1000=y
CONFIG_NET_ETH_PKTSIZE=1514
CONFIG_NET_ICMP_SOCKET=y
CONFIG_NET_IGC=y
CONFIG_NET_LL_GUARDSIZE=32
CONFIG_NET_MAX_LISTENPORTS=8
CONFIG_NET_PKT=y
CONFIG_NET_STATISTICS=y
CONFIG_NET_TCP=y
CONFIG_NET_UDP=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_READLINE=y
CONFIG_PCI=y
CONFIG_PCI_MSIX=y
CONFIG_PCI_QEMU_EDU=y
CONFIG_PCI_QEMU_TEST=y
CONFIG_PIPES=y
CONFIG_PREALLOC_CHILDSTATUS=16
CONFIG_PRIORITY_INHERITANCE=y
CONFIG_PSEUDOFS_ATTRIBUTES=y
CONFIG_PSEUDOFS_FILE=y
CONFIG_PTHREAD_MUTEX_TYPES=y
CONFIG_PTHREAD_STACK_MIN=4194304
CONFIG_RAM_SIZE=268435456
CONFIG_SCHED_CHILD_STATUS=y
CONFIG_SCHED_HAVE_PARENT=y
CONFIG_SCHED_HPWORK=y
CONFIG_SCHED_IRQMONITOR=y
CONFIG_SCHED_LPNTHREADS=1
CONFIG_SCHED_LPWORK=y
CONFIG_SCHED_THREAD_LOCAL=y
CONFIG_SCHED_TICKLESS=y
CONFIG_SIGNAL_FD=y
CONFIG_SIG_DEFAULT=y
CONFIG_SIG_EVTHREAD=y
CONFIG_SMP=y
CONFIG_START_DAY=3
CONFIG_START_MONTH=3
CONFIG_START_YEAR=2011
CONFIG_SYSTEM_CLE=y
CONFIG_SYSTEM_NSH=y
CONFIG_SYSTEM_POPEN=y
CONFIG_SYSTEM_SETLOGMASK=y
CONFIG_TESTING_ATOMIC=y
CONFIG_TESTING_CMOCKA=y
CONFIG_TESTING_CRYPTO=y
CONFIG_TESTING_DRIVER_TEST=y
CONFIG_TESTING_FFF=y
CONFIG_TESTING_FSTEST=y
CONFIG_TESTING_GETPRIME=y
CONFIG_TESTING_HEAP=y
CONFIG_TESTING_LTP=y
CONFIG_TESTING_LTP_STACKSIZE=65536
CONFIG_TESTING_MEMORY_STRESS=y
CONFIG_TESTING_OSTEST=y
CONFIG_TESTING_OSTEST_STACKSIZE=4194304
CONFIG_TESTING_RAMTEST=y
CONFIG_TESTING_SMP=y
CONFIG_TESTING_TIMERJITTER=y
CONFIG_TESTS_TESTSUITES=y
CONFIG_TESTS_TESTSUITES_MOUNT_DIR="/tmp"
CONFIG_TIMER_FD=y
CONFIG_USBHOST=y
CONFIG_USBHOST_COMPOSITE=y
CONFIG_USBHOST_FT232R=y
CONFIG_USBHOST_HIDKBD=y
CONFIG_USBHOST_HIDMOUSE=y
CONFIG_USBHOST_MSC=y
CONFIG_USBHOST_WAITER=y
CONFIG_USBHOST_XHCI_PCI=y
CONFIG_USEC_PER_TICK=1
54 changes: 54 additions & 0 deletions boards/x86_64/qemu/qemu-intel64/configs/citest_smp/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#!/usr/bin/env bash
############################################################################
# boards/x86_64/qemu/qemu-intel64/configs/citest_smp/run.sh
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership. The
# ASF licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
############################################################################

set -o xtrace

# start from nuttx dir
olddir=$(pwd)
nuttdir=${CURRENTCONFDIR}/../../../../../../
cd ${nuttdir}

# run NTFC
confpath=${CURRENTCONFDIR}/config.yaml
jsonconf=${CURRENTCONFDIR}/session.json
testpath=${NTFCDIR}/external/nuttx-testing
ntfc test --testpath=${testpath} --confpath=${confpath} --jsonconf=${jsonconf}

ret="$?"
echo $ret

# export test results
artifacts=${ARTIFACTCONFDIR}/ntfc
mkdir -p ${artifacts}

# A retried build already exported the previous attempt; replace it, or
# "mv result" fails and the leftover directory makes the tree unclean.

rm -rf ${artifacts}/result ${artifacts}/pytest.debug.log
mv pytest.debug.log ${artifacts}
mv result ${artifacts}

# restore old dir
cd ${olddir}

exit $ret
13 changes: 13 additions & 0 deletions boards/x86_64/qemu/qemu-intel64/configs/citest_smp/session.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"module": {
"include_module": [],
"exclude_module":
[
"Nuttx_System_Fs_Fs"
],
"order": []
},
"args": {
"kv": []
}
}
Loading
Loading