#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.