Собрать код для ppc64
У меня есть код сборки для 32-битного PPC, и я запутался, как конвертировать его для 64-битных. Могут ли некоторые показать ссылки на ABI для 64-битных КПК.
Вот пример функции, как будет выглядеть ее 64-битная версия?
SLEAF(cpu_save_context)
stw r0, 0(ARG0)
stw sp, 4(ARG0) /* Stack frame pointer */
stw r2, 8(ARG0)
stw r3, 12(ARG0)
stw r4, 16(ARG0)
stw r5, 20(ARG0)
stw r6, 24(ARG0)
stw r7, 28(ARG0)
stw r8, 32(ARG0)
stw r9, 36(ARG0)
stw r10, 40(ARG0)
stw r11, 44(ARG0)
stw r12, 48(ARG0)
stw r13, 52(ARG0) /* Small data area pointer */
stw r14, 56(ARG0) /* C-registers */
stw r15, 60(ARG0)
stw r16, 64(ARG0)
stw r17, 68(ARG0)
stw r18, 72(ARG0)
stw r19, 76(ARG0)
stw r20, 80(ARG0)
stw r21, 84(ARG0)
stw r22, 88(ARG0)
stw r23, 92(ARG0)
stw r24, 96(ARG0)
stw r25, 100(ARG0)
stw r26, 104(ARG0)
stw r27, 108(ARG0)
stw r28, 112(ARG0)
stw r29, 116(ARG0)
stw r30, 120(ARG0)
stw r31, 124(ARG0)
mfcr r0 /* Fetch condition register */
stw r0, 128(ARG0)
mflr r0 /* Fetch link register */
stw r0, 132(ARG0)
mfctr r0 /* Fetch count register */
stw r0, 136(ARG0)
mfxer r0, /* Fetch fixed-point exception Register */
stw r0, 140(ARG0)
li ARG0, 1 /* Return TRUE to caller. */
blr
END(cpu_save_context
2 ответа
Вместо stw (store word) для регистров общего назначения (r0, sp, r2-r31) и регистров специального назначения LR, CTR, XER следует использовать std (store doubleword). И вам нужно изменить жестко закодированные смещения ARG0 для хранения 8 байтов, чтобы смещения были "0, 8, 16, 24,..." вместо "0, 4, 8, 12, ...". Вам также может понадобиться рассмотреть, есть ли место, выделенное в указателе ARG0 для дополнительной памяти, необходимой для двойных слов вместо слов.
Например:
std r0, 0(ARG0)
std sp, 8(ARG0) /* Stack frame pointer (offset was previously 4) */
Существует много материалов относительно нового ppc64 ABI, также известного как ABI v2.
Наиболее важной из них является официальная спецификация ELFv2 ABI. Есть также некоторые презентации об этом. Все они находятся по следующему URL.