Insl и outsl выдают ошибку «Ограничение соответствия не разрешает регистр»

#linux #gcc #xv6

#linux #gcc #xv6

Вопрос:

Итак, вот код в исходном коде XV6 (x86.h):

 static inline void
outsl(int port, void* addr, int cnt)
{
  asm volatile("cld; rep outsl" :
  "=S" (addr), "=c" (cnt) :
  "d" (port), "0" (addr), "1" (cnt) :
  "cc");
}

static inline void
insl(int port, void* addr, int cnt)
{
  asm volatile("cld; rep insl" :
  "=D" (addr), "=c" (cnt) :
  "d" (port), "0" (addr), "1" (cnt) :
  "memory", "cc");
}
 

Это выдает эту ошибку:

 kernel/x86.h:7:3: error: matching constraint does not allow a register [-Werror]
    7 |   "cc");
      |   ^~~~
kernel/x86.h:4:3: error: matching constraint does not allow a register [-Werror]
    4 |   asm volatile("cld; rep outsl" :
      |   ^~~
kernel/sound.c:53:1: error: matching constraint does not allow a register [-Werror]
   53 | }
      | ^
kernel/sound.c:53:1: error: matching constraint does not allow a register [-Werror]
kernel/sound.c:53:1: error: matching constraint does not allow a register [-Werror]
kernel/sound.c:53:1: error: matching constraint does not allow a register [-Werror]
kernel/sound.c:53:1: error: matching constraint does not allow a register [-Werror]
kernel/sound.c:53:1: error: matching constraint does not allow a register [-Werror]
kernel/sound.c: In function ‘read_pci_config’:
kernel/sound.c:17:3: error: matching constraint does not allow a register [-Werror]
   17 |   outsl(0xcf8, amp;tmp, 1);
      |   ^~~~~~~~~~~~~~~~~~~~~
kernel/sound.c:17:3: error: matching constraint does not allow a register [-Werror]
kernel/sound.c:17:3: error: matching constraint does not allow a register [-Werror]
kernel/sound.c:53:1: error: matching constraint does not allow a register [-Werror]
   53 | }
      | ^
kernel/sound.c:53:1: error: matching constraint does not allow a register [-Werror]
kernel/sound.c:53:1: error: matching constraint does not allow a register [-Werror]
kernel/sound.c:13:6: error: matching constraint does not allow a register [-Werror]
   13 | uint read_pci_config(uchar bus, uchar slot, uchar func, uchar offset)
      |      ^~~~~~~~~~~~~~~
kernel/sound.c:13:6: error: matching constraint does not allow a register [-Werror]
kernel/sound.c:13:6: error: matching constraint does not allow a register [-Werror]
kernel/sound.c:13:6: error: matching constraint does not allow a register [-Werror]
In file included from kernel/sound.c:10:
kernel/x86.h:4:3: error: matching constraint does not allow a register [-Werror]
    4 |   asm volatile("cld; rep outsl" :
      |   ^~~
kernel/x86.h:4:3: error: output number 0 not directly addressable
kernel/x86.h:4:3: error: matching constraint does not allow a register [-Werror]
kernel/x86.h:4:3: error: asm operand 3 probably doesn’t match constraints [-Werror]
cc1: all warnings being treated as errors
make: *** [<builtin>: kernel/sound.o] Error 1
 

Кто-нибудь имел представление о причине такой ошибки?
К вашему сведению, я использую код из более старых версий XV6 в последней версии XV6 (2021.9). Я попытался использовать исходный ввод-вывод.h, который также имеет 2 функции, но выдает ту же ошибку.

Комментарии:

1. Я попытался воспроизвести это сообщение об ошибке в godbolt, но безуспешно. Какая ваша целевая платформа? x86? x64? Глядя на некоторые другие вопросы об этом сообщении об ошибке, возможно, вы могли бы попробовать: asm volatile("cld; rep outsl" : " S" (addr), " c" (cnt) : "d" (port) : "cc"); ?

2. Здесь все работает нормально . Какой компилятор вы используете? Какая версия? Какие флаги компиляции?

3. @NateEldredge Я использую Makefile, предоставленный в MIT XV6 .

4. О, вы создаете версию xv6 для RISC-V. Итак, кажется, что вы берете встроенный asm из версии x86 и пытаетесь использовать его в версии RISC-V, и, естественно, это не сработает; у них совершенно разные наборы инструкций. Какова ваша фактическая цель со всем этим?

5. @NateEldredge Я пытаюсь инициализировать звуковую карту Intel AC97, например, как это сделано здесь для более старой версии Xv6.