Skip to content

[BUG] hartid and cpuid mismatch for RISCV when CONFIG_ARCH_RV_CPUID_MAP is configured #19713

Description

@evolution124

Description / Steps to reproduce the issue

CONFIG_ARCH_RV_CPUID_MAP is configured

  1. bellow code using g_cpux_idlestack to get stack but without translate cpuid to hartid
arch/risc-v/src/common/riscv_cpuidlestack.c
//will read stack by cpuid
stack_alloc = (uintptr_t)g_cpux_idlestack(cpu);

arch/risc-v/src/common/riscv_initialstate.c

// will read stack by cpuid
tcb->stack_alloc_ptr = (void *)g_cpux_idlestack(this_cpu());

arch/risc-v/src/common/riscv_common_memorymap.h

//using cpuid to read stack
#define g_cpux_idlestack(cpuid) \
   (g_idle_topstack - SMP_STACK_SIZE * (CONFIG_SMP_NCPUS - (cpuid)))
  1. if using customized cpuid to hartid mapping like bellow, stack is wrong.
int riscv_hartid_to_cpuid(int hart)
{
#ifdef CONFIG_SMP
  int cpu_id = -1;
  switch(hart) {
    case 0: cpu_id = 0; break;
    case 1: cpu_id = 2; break;
    case 2: cpu_id = 1; break;
    default :
      DEBUGASSERT(0);
    break;
  }
  return cpu_id;
#else
  return 0;
#endif
}

int riscv_cpuid_to_hartid(int cpu)
{
#ifdef CONFIG_SMP
  int hart_id = -1;
  switch(cpu) {
    case 0: hart_id = 0; break;
    case 1: hart_id = 2; break;
    case 2: hart_id = 1; break;
    default :
      DEBUGASSERT(0);
    break;
  }
  return hart_id;
#else
  return up_cpu_index();
#endif
}

On which OS does this issue occur?

[OS: Linux]

What is the version of your OS?

Ubuntu 22.04.4 LTS

NuttX Version

96f440f0c068f278cc11a956c2c6cf52ff79cf01

Issue Architecture

[Arch: risc-v]

Issue Area

[Area: Kernel]

Host information

qemu to run the rv64
qemu-system-riscv64 --version
QEMU emulator version 10.0.0
Copyright (c) 2003-2025 Fabrice Bellard and the QEMU Project developers

Verification

  • I have verified before submitting the report.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Arch: risc-vIssues related to the RISC-V (32-bit or 64-bit) architectureArea: KernelKernel issuesOS: LinuxIssues related to Linux (building system, etc)Type: BugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions