Почему rax установлен в -ENOSYS до TRACE_IRQS_OFF - PullRequest
1 голос
/ 21 февраля 2020

См. https://elixir.bootlin.com/linux/v5.0.21/source/arch/x86/entry/entry_64.S#L168.

  1. Почему RAX нужно изменить?
  2. Почему выбран -ENOSYS?

Скопировано по ссылке выше:

ENTRY(entry_SYSCALL_64)
    UNWIND_HINT_EMPTY
    /*
     * Interrupts are off on entry.
     * We do not frame this tiny irq-off block with TRACE_IRQS_OFF/ON,
     * it is too small to ever cause noticeable irq latency.
     */

    swapgs
    /* tss.sp2 is scratch space. */
    movq    %rsp, PER_CPU_VAR(cpu_tss_rw + TSS_sp2)
    SWITCH_TO_KERNEL_CR3 scratch_reg=%rsp
    movq    PER_CPU_VAR(cpu_current_top_of_stack), %rsp

    /* Construct struct pt_regs on stack */
    pushq   $__USER_DS              /* pt_regs->ss */
    pushq   PER_CPU_VAR(cpu_tss_rw + TSS_sp2)   /* pt_regs->sp */
    pushq   %r11                    /* pt_regs->flags */
    pushq   $__USER_CS              /* pt_regs->cs */
    pushq   %rcx                    /* pt_regs->ip */
GLOBAL(entry_SYSCALL_64_after_hwframe)
    pushq   %rax                    /* pt_regs->orig_ax */

    PUSH_AND_CLEAR_REGS rax=$-ENOSYS

    TRACE_IRQS_OFF
...

1 Ответ

4 голосов
/ 21 февраля 2020

Вызов PUSH_AND_CLEAR_REGS не меняет RAX. Фактически это один из немногих регистров общего назначения, который не очищается (устанавливается в 0) макросом. Поскольку RAX содержит системный вызов вызываемого системного вызова, его значение остается неизменным. Сразу после кода, который вы показали, он передается в качестве первого аргумента do_syscall_64.

. То, что установлено в -ENOSYS, - это сохраненное значение RAX в стеке. То есть вместо сохранения фактического значения RAX макрос сохраняет -ENOSYS. Когда системный вызов возвращает значение в RAX, будет установлено значение -ENOSYS, если do_syscall_64 не изменит его на что-то другое. Предположительно это сделано, если входящее значение RAX не является допустимым номером системного вызова, do_syscall_64 может просто вернуться, а исходящий RAX будет -ENOSYS, указывая, что системный вызов недействителен.

...