set_c0_status() 函数定义在哪里?

3

真令人困惑!我不是内核专家,但这是我第一次找不到一个函数的声明! - Arash Kazemi
1
我也是!这是因为它由奇怪的通用宏定义。我通常使用Perl RegEx查找函数定义:[\s*]+FindmeFn\s*+(((?:[^()]++|(?1))))\s?{ - George Robinson
2个回答

1

set_c0_status函数在mipsregs.h中定义,并通过以下宏层次结构进行扩展:

https://github.com/torvalds/linux/blob/master/arch/mips/include/asm/mipsregs.h

/*
 * Manipulate bits in a register.
 */
#define __BUILD_SET_COMMON(name)                                \
static inline unsigned int                                      \

set_##name(unsigned int set)                                    \
{                                                               \
        unsigned int res, new;                                  \
                                                                \
        res = read_##name();                                    \
        new = res | set;                                        \
        write_##name(new);                                      \
                                                                \
        return res;                                             \
}                                                               \

...

/*
 * Manipulate bits in a c0 register.
 */
#define __BUILD_SET_C0(name)    __BUILD_SET_COMMON(c0_##name)

__BUILD_SET_C0(status)

1
谢谢。多么奇怪的宏! - George Robinson

1
我在arch/mips/kvm/kvm_mips.c中找到了这个。
static
void kvm_mips_set_c0_status (void)
{
    uint32_t status = read_c0_status();

    if (cpu_has_fpu)
    status |= (ST0_CU1);

    if (cpu_has_dsp)
    status |= (ST0_MX);

    write_c0_status(status);
    __asm volatile ("ehb");
}

而 write_c0_status 在 mipsregs.h 中有定义(https://elixir.bootlin.com/linux/latest/source/arch/mips/include/asm/mipsregs.h#L1639),因此我猜你应该在那里寻找答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接