Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support 'west flash' with native_sim, add debugserver support #68835

Merged
merged 1 commit into from Mar 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 3 additions & 2 deletions boards/native/native_posix/board.cmake
Expand Up @@ -3,5 +3,6 @@

set(SUPPORTED_EMU_PLATFORMS native)

board_set_debugger_ifnset(native_gdb)
board_finalize_runner_args(native_gdb)
board_set_debugger_ifnset(native)
board_set_flasher_ifnset(native)
board_finalize_runner_args(native)
5 changes: 3 additions & 2 deletions boards/native/native_sim/board.cmake
Expand Up @@ -2,5 +2,6 @@

set(SUPPORTED_EMU_PLATFORMS native)

board_set_debugger_ifnset(native_gdb)
board_finalize_runner_args(native_gdb)
board_set_debugger_ifnset(native)
board_set_flasher_ifnset(native)
board_finalize_runner_args(native)
5 changes: 3 additions & 2 deletions boards/native/nrf_bsim/board.cmake
Expand Up @@ -3,5 +3,6 @@

set(SUPPORTED_EMU_PLATFORMS native)

board_set_debugger_ifnset(native_gdb)
board_finalize_runner_args(native_gdb)
board_set_debugger_ifnset(native)
board_set_flasher_ifnset(native)
board_finalize_runner_args(native)
2 changes: 1 addition & 1 deletion scripts/west_commands/runners/__init__.py
Expand Up @@ -40,7 +40,7 @@ def _import_runner_module(runner_name):
'linkserver',
'mdb',
'misc',
'native_gdb',
'native',
'nios2',
'nrfjprog',
'nrfutil',
Expand Down
81 changes: 81 additions & 0 deletions scripts/west_commands/runners/native.py
@@ -0,0 +1,81 @@
# Copyright (c) 2023 Nordic Semiconductor
# SPDX-License-Identifier: Apache-2.0

"""This file provides a ZephyrBinaryRunner that launches GDB and enables
flashing (running) a native application."""

import argparse
from runners.core import ZephyrBinaryRunner, RunnerCaps, RunnerConfig

DEFAULT_GDB_PORT = 3333

class NativeSimBinaryRunner(ZephyrBinaryRunner):
"""Runs the ELF binary under GDB."""

def __init__(self, cfg,
tui=False,
gdb_port=DEFAULT_GDB_PORT):
super().__init__(cfg)
self.gdb_port = gdb_port

if cfg.gdb is None:
self.gdb_cmd = None
else:
self.gdb_cmd = [cfg.gdb] + (['-tui'] if tui else [])

if self.cfg.gdb is None:
raise ValueError("The provided RunnerConfig is missing the required field 'gdb'.")

if self.cfg.exe_file is None:
raise ValueError("The provided RunnerConfig is missing the required field 'exe_file'.")


@classmethod
def name(cls):
return 'native'

@classmethod
def capabilities(cls):
return RunnerCaps(commands={'debug', 'debugserver', 'flash'})

@classmethod
def do_add_parser(cls, parser: argparse.ArgumentParser):
parser.add_argument('--tui', default=False, action='store_true',
help='if given, GDB uses -tui')
parser.add_argument('--gdb-port', default=DEFAULT_GDB_PORT,
help='gdb port, defaults to {}'.format(
DEFAULT_GDB_PORT))

@classmethod
def do_create(cls, cfg: RunnerConfig, args: argparse.Namespace) -> ZephyrBinaryRunner:
return NativeSimBinaryRunner(cfg,
tui=args.tui,
gdb_port=args.gdb_port)

def do_run(self, command: str, **kwargs):
if command == 'flash':
self.do_flash(**kwargs)
elif command == 'debug':
self.do_debug(**kwargs)
elif command == 'debugserver':
self.do_debugserver(**kwargs)
else:
assert False

def do_flash(self, **kwargs):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The kwargs are not used. Is it not better to remove them? Same applies to do_debug and do_debugserver.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the "interface" afaik, looking at all the runners:

scripts/west_commands/runners/intel_cyclonev.py:            self.do_flash_elf(**kwargs)
scripts/west_commands/runners/intel_cyclonev.py:            self.do_flash_elf(**kwargs)
scripts/west_commands/runners/intel_cyclonev.py:    def do_flash_elf(self, **kwargs):
scripts/west_commands/runners/native.py:            self.do_flash(**kwargs)
scripts/west_commands/runners/native.py:    def do_flash(self, **kwargs):
scripts/west_commands/runners/nsim.py:            self.do_flash(**kwargs)
scripts/west_commands/runners/nsim.py:    def do_flash(self, **kwargs):
scripts/west_commands/runners/openocd.py:            self.do_flash_elf(**kwargs)
scripts/west_commands/runners/openocd.py:            self.do_flash(**kwargs)
scripts/west_commands/runners/openocd.py:    def do_flash(self, **kwargs):
scripts/west_commands/runners/openocd.py:    def do_flash_elf(self, **kwargs):

No harm in leaving this allowing future expansions

cmd = [self.cfg.exe_file]
self.check_call(cmd)

def do_debug(self, **kwargs):
# Clues to debug missing RunnerConfig values (in context of `west debug`):
# build/zephyr/runners.yaml is missing `gdb` or `elf_file`.
# board.cmake should have `board_finalize_runner_args(native)`.
# build/CMakeCache.txt should have `CMAKE_GDB`.

cmd = (self.gdb_cmd + ['--quiet', self.cfg.exe_file])
self.check_call(cmd)

def do_debugserver(self, **kwargs):
cmd = (['gdbserver', ':{}'.format(self.gdb_port), self.cfg.exe_file])

self.check_call(cmd)
46 changes: 0 additions & 46 deletions scripts/west_commands/runners/native_gdb.py

This file was deleted.

2 changes: 1 addition & 1 deletion scripts/west_commands/tests/test_imports.py
Expand Up @@ -31,7 +31,7 @@ def test_runner_imports():
'mdb-nsim',
'mdb-hw',
'misc-flasher',
'native_gdb',
'native',
'nios2',
'nrfjprog',
'nrfutil',
Expand Down