RIS C -V Соглашение о вызове системного вызова в ПК / Linux - PullRequest
3 голосов
/ 18 января 2020

Каково соглашение о вызовах для системного вызова в программе, работающей под псевдоядром RIS C -V (pk) или Linux?

Просмотр кода, сгенерированного riscv- gnu-toolchain правила выглядят так:

  • номер системного вызова передается в a7
  • аргументы системного вызова передаются в a0 в a5
  • неиспользуемые аргументы установлены в 0
  • возвращаемое значение возвращается в a0

Это так?

Действительно ли необходимо обнулять неиспользованные аргументы?

А как насчет регистра a6? Может ли это использоваться для еще одного аргумента sycall?

Пример, который вызывает системный вызов exit():

li    a0, 1               # argument that is used by the syscall
li    a1, 0               # unused arguments
li    a2, 0
li    a3, 0
li    a4, 0
li    a5, 0
li    a7, 93              # exit syscall number

1 Ответ

3 голосов
/ 19 января 2020

Да, это в основном все.

Нет, нет необходимости обнулять неиспользуемые аргументы. Обнуление неиспользуемого аргумента при использовании riscv-gnu-toolchain (с библиотекой newlib C) - это просто артефакт вызывающего кода newlib sycall. Для простоты в коде имеется одна scall (старое имя для ecall) оболочка с 6 аргументами системного вызова. Таким образом, реализация exit() просто вызывает эту оболочку с некоторыми дополнительными нулями .

Начиная с 2020 года, максимальное количество аргументов в syscall в Linux равно 6, То же самое касается псевдоядра. Таким образом, a6 всегда не используется.

И Linux, и pk предоставляют номер системного вызова в a7. И числа системных вызовов, используемые pk, соответствуют стандарту Linux.

Страница man syscall (2) Linux также суммирует соглашения о вызовах на различных архитектурах, включая RIS C -V. указывает a1, который, возможно, используется для возврата второго возвращаемого значения, но это не соответствует коду в glib c и newlib.

...