Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C structure or a function?

I am trying to understand kvm code in linux and came across tjis:

    static int (*const svm_exit_handlers[])(struct vcpu_svm *svm) = {
[SVM_EXIT_READ_CR0]         = cr_interception,
[SVM_EXIT_READ_CR3]         = cr_interception,
[SVM_EXIT_READ_CR4]         = cr_interception,
[SVM_EXIT_READ_CR8]         = cr_interception,
[SVM_EXIT_CR0_SEL_WRITE]        = emulate_on_interception,
[SVM_EXIT_WRITE_CR0]            = cr_interception,
[SVM_EXIT_WRITE_CR3]            = cr_interception,
[SVM_EXIT_WRITE_CR4]            = cr_interception,
[SVM_EXIT_WRITE_CR8]            = cr8_write_interception,
[SVM_EXIT_READ_DR0]         = dr_interception,
[SVM_EXIT_READ_DR1]         = dr_interception,
[SVM_EXIT_READ_DR2]         = dr_interception,
[SVM_EXIT_READ_DR3]         = dr_interception,
[SVM_EXIT_READ_DR4]         = dr_interception,
[SVM_EXIT_READ_DR5]         = dr_interception,
[SVM_EXIT_READ_DR6]         = dr_interception,
[SVM_EXIT_READ_DR7]         = dr_interception,
[SVM_EXIT_WRITE_DR0]            = dr_interception,
[SVM_EXIT_WRITE_DR1]            = dr_interception,
[SVM_EXIT_WRITE_DR2]            = dr_interception,
[SVM_EXIT_WRITE_DR3]            = dr_interception,
[SVM_EXIT_WRITE_DR4]            = dr_interception,
[SVM_EXIT_WRITE_DR5]            = dr_interception,
[SVM_EXIT_WRITE_DR6]            = dr_interception,
[SVM_EXIT_WRITE_DR7]            = dr_interception,
[SVM_EXIT_EXCP_BASE + DB_VECTOR]    = db_interception,
[SVM_EXIT_EXCP_BASE + BP_VECTOR]    = bp_interception,
[SVM_EXIT_EXCP_BASE + UD_VECTOR]    = ud_interception,
[SVM_EXIT_EXCP_BASE + PF_VECTOR]    = pf_interception,
[SVM_EXIT_EXCP_BASE + NM_VECTOR]    = nm_interception,
[SVM_EXIT_EXCP_BASE + MC_VECTOR]    = mc_interception,
[SVM_EXIT_INTR]             = intr_interception,
[SVM_EXIT_NMI]              = nmi_interception,
[SVM_EXIT_SMI]              = nop_on_interception,
[SVM_EXIT_INIT]             = nop_on_interception,
[SVM_EXIT_VINTR]            = interrupt_window_interception,
[SVM_EXIT_RDPMC]            = rdpmc_interception,
[SVM_EXIT_CPUID]            = cpuid_interception,
[SVM_EXIT_IRET]                         = iret_interception,
[SVM_EXIT_INVD]                         = emulate_on_interception,
[SVM_EXIT_PAUSE]            = pause_interception,
[SVM_EXIT_HLT]              = halt_interception,
[SVM_EXIT_INVLPG]           = invlpg_interception,
[SVM_EXIT_INVLPGA]          = invlpga_interception,
[SVM_EXIT_IOIO]             = io_interception,
[SVM_EXIT_MSR]              = msr_interception,
[SVM_EXIT_TASK_SWITCH]          = task_switch_interception,
[SVM_EXIT_SHUTDOWN]         = shutdown_interception,
[SVM_EXIT_VMRUN]            = vmrun_interception,
[SVM_EXIT_VMMCALL]          = vmmcall_interception,
[SVM_EXIT_VMLOAD]           = vmload_interception,
[SVM_EXIT_VMSAVE]           = vmsave_interception,
[SVM_EXIT_STGI]             = stgi_interception,
[SVM_EXIT_CLGI]             = clgi_interception,
[SVM_EXIT_SKINIT]           = skinit_interception,
[SVM_EXIT_WBINVD]                       = emulate_on_interception,
[SVM_EXIT_MONITOR]          = invalid_op_interception,
[SVM_EXIT_MWAIT]            = invalid_op_interception,
[SVM_EXIT_XSETBV]           = xsetbv_interception,
[SVM_EXIT_NPF]              = pf_interception,

};

I am well versed in C but haven't come across this anywhere and really confused if this is a function or a structure declaration or otherwise. Any help would be gladly accepted.

like image 441
Minerva Avatar asked Dec 15 '25 01:12

Minerva


1 Answers

This is an array of function pointers.

It is initialized using designated initializers.

EDIT: The declaration can be read as follows --

declare svm_exit_handlers as a static array of const pointer to function that takes pointer to struct vcpu_svm and returns int

(You may find http://www.cdecl.org somewhat helpful for parsing difficult C declarations.)

In more colloquial English, that means this is an array of function pointers. The functions pointed to are of the form int foo(struct vcpu_svm *svm).

EDIT: The designated initializers may be somewhat confusing too. See http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

like image 74
cklin Avatar answered Dec 16 '25 20:12

cklin