어셈블리 코드를 포함하는 커널 모듈 작성 질문
obj-m := $(MODULE_NAME).o
$(MODULE_NAME)-objs += test.o memio.o
여기서 memio.o의 소스는 memio.S의 어셈블리어 코드로 이루어진 파일입니다.
그런데 위와 같이 하고 make를 하면
/memio.S: Assembler messages:
/memio.S:7: Error: unsupported relocation against r9
/memio.S:7: Error: unsupported relocation against r5
/memio.S:7: Error: unsupported relocation against r8
/memio.S:7: Error: unsupported relocation against r4
/memio.S:7: Error: unsupported relocation against r7
/memio.S:7: Error: unsupported relocation against r3
/memio.S:7: Error: unsupported relocation against r9
/memio.S:7: Error: unsupported relocation against r8
....
....
.
이렇게 계속 에러가나옵니다.
어셈블리어 코드는
#include "macros.h"
.globl pci_read_cfg_byte
pci_read_cfg_byte:
config_addr
config_data 3
eieio
sync
lbz r3, 0(r9)
blr
.globl pci_write_cfg_byte
pci_write_cfg_byte:
config_addr
config_data 3
stb r6, 0(r9)
eieio
sync
blr
.globl pci_read_cfg_word
...
...
...
.
이렇게 되어있구요..
macros.h는
#ifndef _MACROS_H
#define _MACROS_H
/*
** Load a long integer into a register
*/
.macro liw reg, value
lis \reg, \value@h
ori \reg, \reg, \value@l
.endm
/*
** Generate config_addr request
** This macro expects the values in registers:
** r3 - bus
** r4 - devfn
** r5 - offset
*/
.macro config_addr
rlwinm r9, r5, 24, 0, 6
rlwinm r8, r4, 16, 0, 31
rlwinm r7, r3, 8, 0, 31
or r9, r8, r9
or r9, r7, r9
ori r9, r9, 0x80
liw r10, 0xfec00cf8
stw r9, 0(r10)
eieio
sync
.endm
/*
** Generate config_data address
*/
.macro config_data mask
andi. r9, r5, \mask
.. 이런식입니다.
뭐가 틀렸나요??
댓글 달기