arch/riscv/kernel/paravirt.c
Source file repositories/reference/linux-study-clean/arch/riscv/kernel/paravirt.c
File Facts
- System
- Linux kernel
- Corpus path
arch/riscv/kernel/paravirt.c- Extension
.c- Size
- 2886 bytes
- Lines
- 127
- Domain
- Architecture Layer
- Bucket
- arch/riscv
- Inferred role
- Architecture Layer: implementation source
- Status
- source implementation candidate
Why This File Exists
CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/cpuhotplug.hlinux/compiler.hlinux/errno.hlinux/init.hlinux/jump_label.hlinux/kconfig.hlinux/kernel.hlinux/percpu-defs.hlinux/printk.hlinux/static_call.hlinux/types.hlinux/sched/cputime.hasm/barrier.hasm/page.hasm/paravirt.hasm/sbi.h
Detected Declarations
function parse_no_stealaccfunction has_pv_steal_clockfunction sbi_sta_steal_time_set_shmemfunction pv_time_cpu_onlinefunction pv_time_cpu_down_preparefunction pv_time_steal_clockfunction pv_time_init
Annotated Snippet
sbi_probe_extension(SBI_EXT_STA) > 0) {
pr_info("SBI STA extension detected\n");
return true;
}
return false;
}
static int sbi_sta_steal_time_set_shmem(unsigned long lo, unsigned long hi,
unsigned long flags)
{
struct sbiret ret;
ret = sbi_ecall(SBI_EXT_STA, SBI_EXT_STA_STEAL_TIME_SET_SHMEM,
lo, hi, flags, 0, 0, 0);
if (ret.error) {
if (lo == SBI_SHMEM_DISABLE && hi == SBI_SHMEM_DISABLE)
pr_warn("Failed to disable steal-time shmem");
else
pr_warn("Failed to set steal-time shmem");
return sbi_err_map_linux_errno(ret.error);
}
return 0;
}
static int pv_time_cpu_online(unsigned int cpu)
{
struct sbi_sta_struct *st = this_cpu_ptr(&steal_time);
phys_addr_t pa = __pa(st);
unsigned long lo = (unsigned long)pa;
unsigned long hi = IS_ENABLED(CONFIG_32BIT) ? upper_32_bits((u64)pa) : 0;
return sbi_sta_steal_time_set_shmem(lo, hi, 0);
}
static int pv_time_cpu_down_prepare(unsigned int cpu)
{
return sbi_sta_steal_time_set_shmem(SBI_SHMEM_DISABLE,
SBI_SHMEM_DISABLE, 0);
}
static u64 pv_time_steal_clock(int cpu)
{
struct sbi_sta_struct *st = per_cpu_ptr(&steal_time, cpu);
__le32 sequence;
__le64 steal;
/*
* Check the sequence field before and after reading the steal
* field. Repeat the read if it is different or odd.
*/
do {
sequence = READ_ONCE(st->sequence);
virt_rmb();
steal = READ_ONCE(st->steal);
virt_rmb();
} while ((le32_to_cpu(sequence) & 1) ||
sequence != READ_ONCE(st->sequence));
return le64_to_cpu(steal);
}
int __init pv_time_init(void)
{
int ret;
if (!has_pv_steal_clock())
return 0;
ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN,
"riscv/pv_time:online",
pv_time_cpu_online,
pv_time_cpu_down_prepare);
if (ret < 0)
return ret;
static_call_update(pv_steal_clock, pv_time_steal_clock);
static_key_slow_inc(¶virt_steal_enabled);
if (steal_acc)
static_key_slow_inc(¶virt_steal_rq_enabled);
pr_info("Computing paravirt steal-time\n");
return 0;
}
Annotation
- Immediate include surface: `linux/cpuhotplug.h`, `linux/compiler.h`, `linux/errno.h`, `linux/init.h`, `linux/jump_label.h`, `linux/kconfig.h`, `linux/kernel.h`, `linux/percpu-defs.h`.
- Detected declarations: `function parse_no_stealacc`, `function has_pv_steal_clock`, `function sbi_sta_steal_time_set_shmem`, `function pv_time_cpu_online`, `function pv_time_cpu_down_prepare`, `function pv_time_steal_clock`, `function pv_time_init`.
- Atlas domain: Architecture Layer / arch/riscv.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.