mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-09 15:26:47 +00:00
wrench: 更新Makefile
This commit is contained in:
parent
9dfd4d9d6e
commit
a3b5102a36
101
kernel/Makefile
101
kernel/Makefile
@ -12,27 +12,19 @@ LIB_FILES := $(foreach DIR,$(DIR_LIB),$(addprefix $(DIR)/,$(lib_patterns)))
|
|||||||
PIC := _INTR_APIC_
|
PIC := _INTR_APIC_
|
||||||
CFLAGS = $(GLOBAL_CFLAGS) -D $(PIC) -I $(shell pwd)
|
CFLAGS = $(GLOBAL_CFLAGS) -D $(PIC) -I $(shell pwd)
|
||||||
|
|
||||||
ASFLAGS := --64
|
export ASFLAGS := --64
|
||||||
|
|
||||||
LD_LIST := head.o
|
LD_LIST := head.o
|
||||||
OBJ_LIST := head.o
|
OBJ_LIST := head.o
|
||||||
|
|
||||||
|
|
||||||
kernel_subdirs := common driver process debug filesystem time
|
kernel_subdirs := common driver process debug filesystem time arch exception mm smp sched syscall
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
head.o: head.S
|
head.o: head.S
|
||||||
gcc -E head.S > head.s # 预处理
|
gcc -E head.S > head.s # 预处理
|
||||||
as $(ASFLAGS) -o head.o head.s
|
as $(ASFLAGS) -o head.o head.s
|
||||||
#gcc -mcmodel=large -fno-builtin -m64 -c head.S -o head.o
|
|
||||||
|
|
||||||
entry.o: exception/entry.S
|
|
||||||
gcc -E exception/entry.S > exception/entry.s
|
|
||||||
as $(ASFLAGS) -o exception/entry.o exception/entry.s
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
main.o: main.c
|
main.o: main.c
|
||||||
@ -41,91 +33,6 @@ main.o: main.c
|
|||||||
gcc $(CFLAGS) -c main.c -o main.o
|
gcc $(CFLAGS) -c main.c -o main.o
|
||||||
|
|
||||||
|
|
||||||
printk.o: common/printk.c
|
|
||||||
gcc $(CFLAGS) -c common/printk.c -o common/printk.o
|
|
||||||
|
|
||||||
trap.o: exception/trap.c
|
|
||||||
gcc $(CFLAGS) -c exception/trap.c -o exception/trap.o
|
|
||||||
|
|
||||||
irq.o: exception/irq.c
|
|
||||||
gcc $(CFLAGS) -c exception/irq.c -o exception/irq.o
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mm.o: mm/mm.c
|
|
||||||
gcc $(CFLAGS) -c mm/mm.c -o mm/mm.o
|
|
||||||
|
|
||||||
slab.o: mm/slab.c
|
|
||||||
gcc $(CFLAGS) -c mm/slab.c -o mm/slab.o
|
|
||||||
|
|
||||||
|
|
||||||
sched.o: sched/sched.c
|
|
||||||
gcc $(CFLAGS) -c sched/sched.c -o sched/sched.o
|
|
||||||
|
|
||||||
syscall.o: syscall/syscall.c
|
|
||||||
gcc $(CFLAGS) -c syscall/syscall.c -o syscall/syscall.o
|
|
||||||
|
|
||||||
smp.o: smp/smp.c
|
|
||||||
gcc $(CFLAGS) -c smp/smp.c -o smp/smp.o
|
|
||||||
|
|
||||||
apu_boot.o: smp/apu_boot.S
|
|
||||||
gcc -E smp/apu_boot.S > smp/apu_boot.s # 预处理
|
|
||||||
as $(ASFLAGS) -o smp/apu_boot.o smp/apu_boot.s
|
|
||||||
|
|
||||||
cpu.o: common/cpu.c
|
|
||||||
gcc $(CFLAGS) -c common/cpu.c -o common/cpu.o
|
|
||||||
|
|
||||||
softirq.o: exception/softirq.c
|
|
||||||
gcc $(CFLAGS) -c exception/softirq.c -o exception/softirq.o
|
|
||||||
|
|
||||||
|
|
||||||
# IPI的代码
|
|
||||||
ifeq ($(ARCH), __x86_64__)
|
|
||||||
OBJ_LIST += ipi.o
|
|
||||||
LD_LIST += arch/x86_64/x86_64_ipi.o
|
|
||||||
ipi.o: arch/x86_64/x86_64_ipi.c
|
|
||||||
gcc $(CFLAGS) -c arch/x86_64/x86_64_ipi.c -o arch/x86_64/x86_64_ipi.o
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
# 驱动程序
|
|
||||||
|
|
||||||
|
|
||||||
multiboot2.o: driver/multiboot2/multiboot2.c
|
|
||||||
gcc $(CFLAGS) -c driver/multiboot2/multiboot2.c -o driver/multiboot2/multiboot2.o
|
|
||||||
|
|
||||||
acpi.o: driver/acpi/acpi.c
|
|
||||||
gcc $(CFLAGS) -c driver/acpi/acpi.c -o driver/acpi/acpi.o
|
|
||||||
|
|
||||||
ps2_keyboard.o: driver/keyboard/ps2_keyboard.c
|
|
||||||
gcc $(CFLAGS) -c driver/keyboard/ps2_keyboard.c -o driver/keyboard/ps2_keyboard.o
|
|
||||||
|
|
||||||
ps2_mouse.o: driver/mouse/ps2_mouse.c
|
|
||||||
gcc $(CFLAGS) -c driver/mouse/ps2_mouse.c -o driver/mouse/ps2_mouse.o
|
|
||||||
|
|
||||||
ata.o: driver/disk/ata.c
|
|
||||||
gcc $(CFLAGS) -c driver/disk/ata.c -o driver/disk/ata.o
|
|
||||||
|
|
||||||
pci.o: driver/pci/pci.c
|
|
||||||
gcc $(CFLAGS) -c driver/pci/pci.c -o driver/pci/pci.o
|
|
||||||
|
|
||||||
ahci.o: driver/disk/ahci/ahci.c
|
|
||||||
gcc $(CFLAGS) -c driver/disk/ahci/ahci.c -o driver/disk/ahci/ahci.o
|
|
||||||
|
|
||||||
rtc.o: driver/timers/rtc/rtc.c
|
|
||||||
gcc $(CFLAGS) -c driver/timers/rtc/rtc.c -o driver/timers/rtc/rtc.o
|
|
||||||
|
|
||||||
HPET.o: driver/timers/HPET/HPET.c
|
|
||||||
gcc $(CFLAGS) -c driver/timers/HPET/HPET.c -o driver/timers/HPET/HPET.o
|
|
||||||
|
|
||||||
|
|
||||||
OBJ_LIST += uart.o
|
|
||||||
LD_LIST += driver/uart/uart.o
|
|
||||||
uart.o: driver/uart/uart.c
|
|
||||||
gcc $(CFLAGS) -c driver/uart/uart.c -o driver/uart/uart.o
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
all: kernel
|
all: kernel
|
||||||
echo "Linking kernel..."
|
echo "Linking kernel..."
|
||||||
ld -b elf64-x86-64 -z muldefs -o kernel head.o main.o $(shell find . -name "*.o") -T link.lds
|
ld -b elf64-x86-64 -z muldefs -o kernel head.o main.o $(shell find . -name "*.o") -T link.lds
|
||||||
@ -140,14 +47,14 @@ all: kernel
|
|||||||
|
|
||||||
# 重新链接
|
# 重新链接
|
||||||
echo "Re-Linking kernel..."
|
echo "Re-Linking kernel..."
|
||||||
ld -b elf64-x86-64 -z muldefs -o kernel head.o main.o $(shell find . -name "*.o") ./debug/kallsyms.o -T link.lds
|
ld -b elf64-x86-64 -z muldefs -o kernel head.o main.o $(shell find . -name "*.o") -T link.lds
|
||||||
echo "Generating kernel ELF file..."
|
echo "Generating kernel ELF file..."
|
||||||
# 生成内核文件
|
# 生成内核文件
|
||||||
objcopy -I elf64-x86-64 -O elf64-x86-64 -R ".comment" -R ".eh_frame" kernel ../bin/kernel/kernel.elf
|
objcopy -I elf64-x86-64 -O elf64-x86-64 -R ".comment" -R ".eh_frame" kernel ../bin/kernel/kernel.elf
|
||||||
echo "Done."
|
echo "Done."
|
||||||
|
|
||||||
|
|
||||||
kernel: head.o entry.o main.o printk.o trap.o mm.o slab.o irq.o sched.o syscall.o multiboot2.o cpu.o acpi.o ps2_keyboard.o ps2_mouse.o ata.o pci.o ahci.o smp.o apu_boot.o rtc.o HPET.o softirq.o $(OBJ_LIST)
|
kernel: head.o main.o $(OBJ_LIST)
|
||||||
|
|
||||||
@list='$(kernel_subdirs)'; for subdir in $$list; do \
|
@list='$(kernel_subdirs)'; for subdir in $$list; do \
|
||||||
echo "make all in $$subdir";\
|
echo "make all in $$subdir";\
|
||||||
|
17
kernel/arch/Makefile
Normal file
17
kernel/arch/Makefile
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
ifeq ($(ARCH), __x86_64__)
|
||||||
|
kernel_arch_subdirs:=x86_64
|
||||||
|
endif
|
||||||
|
|
||||||
|
all:
|
||||||
|
@list='$(kernel_arch_subdirs)'; for subdir in $$list; do \
|
||||||
|
echo "make all in $$subdir";\
|
||||||
|
cd $$subdir;\
|
||||||
|
$(MAKE) all CFLAGS="$(CFLAGS)" PIC="$(PIC)";\
|
||||||
|
cd ..;\
|
||||||
|
done
|
||||||
|
|
||||||
|
clean:
|
||||||
|
echo "Done."
|
7
kernel/arch/x86_64/Makefile
Normal file
7
kernel/arch/x86_64/Makefile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
all: x86_64_ipi.o
|
||||||
|
|
||||||
|
x86_64_ipi.o: x86_64_ipi.c
|
||||||
|
gcc $(CFLAGS) -c x86_64_ipi.c -o x86_64_ipi.o
|
||||||
|
|
@ -3,7 +3,7 @@ CFLAGS += -I .
|
|||||||
|
|
||||||
kernel_common_subdirs:=libELF math
|
kernel_common_subdirs:=libELF math
|
||||||
|
|
||||||
all: glib.o
|
all: glib.o printk.o cpu.o
|
||||||
@list='$(kernel_common_subdirs)'; for subdir in $$list; do \
|
@list='$(kernel_common_subdirs)'; for subdir in $$list; do \
|
||||||
echo "make all in $$subdir";\
|
echo "make all in $$subdir";\
|
||||||
cd $$subdir;\
|
cd $$subdir;\
|
||||||
@ -13,3 +13,9 @@ all: glib.o
|
|||||||
|
|
||||||
glib.o: glib.c
|
glib.o: glib.c
|
||||||
gcc $(CFLAGS) -c glib.c -o glib.o
|
gcc $(CFLAGS) -c glib.c -o glib.o
|
||||||
|
|
||||||
|
printk.o: printk.c
|
||||||
|
gcc $(CFLAGS) -c printk.c -o printk.o
|
||||||
|
|
||||||
|
cpu.o: cpu.c
|
||||||
|
gcc $(CFLAGS) -c cpu.c -o cpu.o
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
CFLAGS += -I .
|
CFLAGS += -I .
|
||||||
|
|
||||||
kernel_driver_subdirs:=video interrupt usb
|
kernel_driver_subdirs:=video interrupt usb pci uart acpi disk keyboard mouse multiboot2 timers
|
||||||
|
|
||||||
all:
|
all:
|
||||||
@list='$(kernel_driver_subdirs)'; for subdir in $$list; do \
|
@list='$(kernel_driver_subdirs)'; for subdir in $$list; do \
|
||||||
|
8
kernel/driver/acpi/Makefile
Normal file
8
kernel/driver/acpi/Makefile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
all: acpi.o
|
||||||
|
|
||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
|
||||||
|
acpi.o: acpi.c
|
||||||
|
gcc $(CFLAGS) -c acpi.c -o acpi.o
|
10
kernel/driver/disk/Makefile
Normal file
10
kernel/driver/disk/Makefile
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
all: ata.o ahci.o
|
||||||
|
|
||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
ata.o: ata.c
|
||||||
|
gcc $(CFLAGS) -c ata.c -o ata.o
|
||||||
|
|
||||||
|
ahci.o: ahci/ahci.c
|
||||||
|
gcc $(CFLAGS) -c ahci/ahci.c -o ahci/ahci.o
|
8
kernel/driver/keyboard/Makefile
Normal file
8
kernel/driver/keyboard/Makefile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
all: ps2_keyboard.o
|
||||||
|
|
||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
|
||||||
|
ps2_keyboard.o: ps2_keyboard.c
|
||||||
|
gcc $(CFLAGS) -c ps2_keyboard.c -o ps2_keyboard.o
|
8
kernel/driver/mouse/Makefile
Normal file
8
kernel/driver/mouse/Makefile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
all: ps2_mouse.o
|
||||||
|
|
||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
|
||||||
|
ps2_mouse.o: ps2_mouse.c
|
||||||
|
gcc $(CFLAGS) -c ps2_mouse.c -o ps2_mouse.o
|
7
kernel/driver/multiboot2/Makefile
Normal file
7
kernel/driver/multiboot2/Makefile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
all: multiboot2.o
|
||||||
|
|
||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
multiboot2.o: multiboot2.c
|
||||||
|
gcc $(CFLAGS) -c multiboot2.c -o multiboot2.o
|
11
kernel/driver/pci/Makefile
Normal file
11
kernel/driver/pci/Makefile
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
|
||||||
|
all: pci.o msi.o
|
||||||
|
|
||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
|
||||||
|
pci.o: pci.c
|
||||||
|
gcc $(CFLAGS) -c pci.c -o pci.o
|
||||||
|
|
||||||
|
msi.o: msi.c
|
||||||
|
gcc $(CFLAGS) -c msi.c -o msi.o
|
229
kernel/driver/pci/msi.c
Normal file
229
kernel/driver/pci/msi.c
Normal file
@ -0,0 +1,229 @@
|
|||||||
|
#include "msi.h"
|
||||||
|
#include "pci.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 生成架构相关的msi的message address
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define pci_get_arch_msi_message_address(processor) ((uint64_t)(0xfee00000UL | (processor << 12)))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 生成架构相关的message data
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define pci_get_arch_msi_message_data(vector, processor, edge_trigger, assert) ((uint32_t)((vector & 0xff) | (edge_trigger == 1 ? 0 : (1 << 15)) | ((assert == 0) ? 0 : (1 << 14))))
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 启用 Message Signaled Interrupts
|
||||||
|
*
|
||||||
|
* @param header 设备header
|
||||||
|
* @param vector 中断向量号
|
||||||
|
* @param processor 要投递到的处理器
|
||||||
|
* @param edge_trigger 是否边缘触发
|
||||||
|
* @param assert 是否高电平触发
|
||||||
|
*
|
||||||
|
* @return 返回码
|
||||||
|
*/
|
||||||
|
int pci_enable_msi(void *header, uint8_t vector, uint32_t processor, uint8_t edge_trigger, uint8_t assert)
|
||||||
|
{
|
||||||
|
struct pci_device_structure_header_t *ptr = (struct pci_device_structure_header_t *)header;
|
||||||
|
uint32_t cap_ptr;
|
||||||
|
uint32_t tmp;
|
||||||
|
uint16_t message_control;
|
||||||
|
uint64_t message_addr;
|
||||||
|
switch (ptr->HeaderType)
|
||||||
|
{
|
||||||
|
case 0x00: // general device
|
||||||
|
if (!(ptr->Status & 0x10))
|
||||||
|
return E_NOT_SUPPORT_MSI;
|
||||||
|
|
||||||
|
cap_ptr = ((struct pci_device_structure_general_device_t *)ptr)->Capabilities_Pointer;
|
||||||
|
|
||||||
|
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
||||||
|
message_control = (tmp >> 16) & 0xffff;
|
||||||
|
|
||||||
|
if (tmp & 0xff != 0x5)
|
||||||
|
return E_NOT_SUPPORT_MSI;
|
||||||
|
|
||||||
|
// 写入message address
|
||||||
|
message_addr = pci_get_arch_msi_message_address(processor); // 获取message address
|
||||||
|
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0x4, (uint32_t)(message_addr & 0xffffffff));
|
||||||
|
|
||||||
|
if (message_control & (1 << 7)) // 64位
|
||||||
|
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0x8, (uint32_t)((message_addr >> 32) & 0xffffffff));
|
||||||
|
|
||||||
|
// 写入message data
|
||||||
|
tmp = pci_get_arch_msi_message_data(vector, processor, edge_trigger, assert);
|
||||||
|
if (message_control & (1 << 7)) // 64位
|
||||||
|
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0xc, tmp);
|
||||||
|
else
|
||||||
|
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0x8, tmp);
|
||||||
|
|
||||||
|
// 使能msi
|
||||||
|
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
||||||
|
tmp |= (1 << 16);
|
||||||
|
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr, tmp);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x01: // pci to pci bridge
|
||||||
|
if (!(ptr->Status & 0x10))
|
||||||
|
return E_NOT_SUPPORT_MSI;
|
||||||
|
cap_ptr = ((struct pci_device_structure_pci_to_pci_bridge_t *)ptr)->Capability_Pointer;
|
||||||
|
|
||||||
|
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
||||||
|
|
||||||
|
message_control = (tmp >> 16) & 0xffff;
|
||||||
|
|
||||||
|
if (tmp & 0xff != 0x5)
|
||||||
|
return E_NOT_SUPPORT_MSI;
|
||||||
|
|
||||||
|
// 写入message address
|
||||||
|
message_addr = pci_get_arch_msi_message_address(processor); // 获取message address
|
||||||
|
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0x4, (uint32_t)(message_addr & 0xffffffff));
|
||||||
|
|
||||||
|
if (message_control & (1 << 7)) // 64位
|
||||||
|
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0x8, (uint32_t)((message_addr >> 32) & 0xffffffff));
|
||||||
|
|
||||||
|
// 写入message data
|
||||||
|
tmp = pci_get_arch_msi_message_data(vector, processor, edge_trigger, assert);
|
||||||
|
if (message_control & (1 << 7)) // 64位
|
||||||
|
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0xc, tmp);
|
||||||
|
else
|
||||||
|
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0x8, tmp);
|
||||||
|
|
||||||
|
// 使能msi
|
||||||
|
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
||||||
|
tmp |= (1 << 16);
|
||||||
|
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr, tmp);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x02: // pci to card bus bridge
|
||||||
|
return E_NOT_SUPPORT_MSI;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: // 不应该到达这里
|
||||||
|
return E_WRONG_HEADER_TYPE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 在已配置好msi寄存器的设备上,使能msi
|
||||||
|
*
|
||||||
|
* @param header 设备头部
|
||||||
|
* @return int 返回码
|
||||||
|
*/
|
||||||
|
int pci_start_msi(void *header)
|
||||||
|
{
|
||||||
|
struct pci_device_structure_header_t *ptr = (struct pci_device_structure_header_t *)header;
|
||||||
|
uint32_t cap_ptr;
|
||||||
|
uint32_t tmp;
|
||||||
|
|
||||||
|
switch (ptr->HeaderType)
|
||||||
|
{
|
||||||
|
case 0x00: // general device
|
||||||
|
if (!(ptr->Status & 0x10))
|
||||||
|
return E_NOT_SUPPORT_MSI;
|
||||||
|
cap_ptr = ((struct pci_device_structure_general_device_t *)ptr)->Capabilities_Pointer;
|
||||||
|
|
||||||
|
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
||||||
|
|
||||||
|
if (tmp & 0xff != 0x5)
|
||||||
|
return E_NOT_SUPPORT_MSI;
|
||||||
|
|
||||||
|
// 使能msi
|
||||||
|
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
||||||
|
tmp |= (1 << 16);
|
||||||
|
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr, tmp);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x01: // pci to pci bridge
|
||||||
|
if (!(ptr->Status & 0x10))
|
||||||
|
return E_NOT_SUPPORT_MSI;
|
||||||
|
cap_ptr = ((struct pci_device_structure_pci_to_pci_bridge_t *)ptr)->Capability_Pointer;
|
||||||
|
|
||||||
|
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
||||||
|
|
||||||
|
if (tmp & 0xff != 0x5)
|
||||||
|
return E_NOT_SUPPORT_MSI;
|
||||||
|
|
||||||
|
//使能msi
|
||||||
|
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
||||||
|
tmp |= (1 << 16);
|
||||||
|
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr, tmp);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x02: // pci to card bus bridge
|
||||||
|
return E_NOT_SUPPORT_MSI;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: // 不应该到达这里
|
||||||
|
return E_WRONG_HEADER_TYPE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief 禁用指定设备的msi
|
||||||
|
*
|
||||||
|
* @param header pci header
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
int pci_disable_msi(void *header)
|
||||||
|
{
|
||||||
|
struct pci_device_structure_header_t *ptr = (struct pci_device_structure_header_t *)header;
|
||||||
|
uint32_t cap_ptr;
|
||||||
|
uint32_t tmp;
|
||||||
|
|
||||||
|
switch (ptr->HeaderType)
|
||||||
|
{
|
||||||
|
case 0x00: // general device
|
||||||
|
if (!(ptr->Status & 0x10))
|
||||||
|
return E_NOT_SUPPORT_MSI;
|
||||||
|
cap_ptr = ((struct pci_device_structure_general_device_t *)ptr)->Capabilities_Pointer;
|
||||||
|
|
||||||
|
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
||||||
|
|
||||||
|
if (tmp & 0xff != 0x5)
|
||||||
|
return E_NOT_SUPPORT_MSI;
|
||||||
|
|
||||||
|
// 禁用msi
|
||||||
|
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
||||||
|
tmp &= (~(1 << 16));
|
||||||
|
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr, tmp);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x01: // pci to pci bridge
|
||||||
|
if (!(ptr->Status & 0x10))
|
||||||
|
return E_NOT_SUPPORT_MSI;
|
||||||
|
cap_ptr = ((struct pci_device_structure_pci_to_pci_bridge_t *)ptr)->Capability_Pointer;
|
||||||
|
|
||||||
|
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
||||||
|
|
||||||
|
if (tmp & 0xff != 0x5)
|
||||||
|
return E_NOT_SUPPORT_MSI;
|
||||||
|
|
||||||
|
//禁用msi
|
||||||
|
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
||||||
|
tmp &= (~(1 << 16));
|
||||||
|
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr, tmp);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x02: // pci to card bus bridge
|
||||||
|
return E_NOT_SUPPORT_MSI;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: // 不应该到达这里
|
||||||
|
return E_WRONG_HEADER_TYPE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
32
kernel/driver/pci/msi.h
Normal file
32
kernel/driver/pci/msi.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <common/glib.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 启用 Message Signaled Interrupts
|
||||||
|
*
|
||||||
|
* @param header 设备header
|
||||||
|
* @param vector 中断向量号
|
||||||
|
* @param processor 要投递到的处理器
|
||||||
|
* @param edge_trigger 是否边缘触发
|
||||||
|
* @param assert 是否高电平触发
|
||||||
|
*
|
||||||
|
* @return 返回码
|
||||||
|
*/
|
||||||
|
int pci_enable_msi(void * header, uint8_t vector, uint32_t processor, uint8_t edge_trigger, uint8_t assert);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 禁用指定设备的msi
|
||||||
|
*
|
||||||
|
* @param header pci header
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
int pci_disable_msi(void *header);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 在已配置好msi寄存器的设备上,使能msi
|
||||||
|
*
|
||||||
|
* @param header 设备头部
|
||||||
|
* @return int 返回码
|
||||||
|
*/
|
||||||
|
int pci_start_msi(void *header);
|
@ -26,17 +26,6 @@ static void pci_checkBus(uint8_t bus);
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 生成架构相关的msi的message address
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#define pci_get_arch_msi_message_address(processor) ((uint64_t)(0xfee00000UL | (processor << 12)))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 生成架构相关的message data
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#define pci_get_arch_msi_message_data(vector, processor, edge_trigger, assert) ((uint32_t)((vector & 0xff) | (edge_trigger == 1 ? 0 : (1 << 15)) | ((assert == 0) ? 0 : (1 << 14))))
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 从pci配置空间读取信息
|
* @brief 从pci配置空间读取信息
|
||||||
@ -479,219 +468,6 @@ void pci_init()
|
|||||||
kinfo("PCI bus initialized.")
|
kinfo("PCI bus initialized.")
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 启用 Message Signaled Interrupts
|
|
||||||
*
|
|
||||||
* @param header 设备header
|
|
||||||
* @param vector 中断向量号
|
|
||||||
* @param processor 要投递到的处理器
|
|
||||||
* @param edge_trigger 是否边缘触发
|
|
||||||
* @param assert 是否高电平触发
|
|
||||||
*
|
|
||||||
* @return 返回码
|
|
||||||
*/
|
|
||||||
int pci_enable_msi(void *header, uint8_t vector, uint32_t processor, uint8_t edge_trigger, uint8_t assert)
|
|
||||||
{
|
|
||||||
struct pci_device_structure_header_t *ptr = (struct pci_device_structure_header_t *)header;
|
|
||||||
uint32_t cap_ptr;
|
|
||||||
uint32_t tmp;
|
|
||||||
uint16_t message_control;
|
|
||||||
uint64_t message_addr;
|
|
||||||
switch (ptr->HeaderType)
|
|
||||||
{
|
|
||||||
case 0x00: // general device
|
|
||||||
if (!(ptr->Status & 0x10))
|
|
||||||
return E_NOT_SUPPORT_MSI;
|
|
||||||
|
|
||||||
cap_ptr = ((struct pci_device_structure_general_device_t *)ptr)->Capabilities_Pointer;
|
|
||||||
|
|
||||||
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
|
||||||
message_control = (tmp >> 16) & 0xffff;
|
|
||||||
|
|
||||||
if (tmp & 0xff != 0x5)
|
|
||||||
return E_NOT_SUPPORT_MSI;
|
|
||||||
|
|
||||||
// 写入message address
|
|
||||||
message_addr = pci_get_arch_msi_message_address(processor); // 获取message address
|
|
||||||
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0x4, (uint32_t)(message_addr & 0xffffffff));
|
|
||||||
|
|
||||||
if (message_control & (1 << 7)) // 64位
|
|
||||||
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0x8, (uint32_t)((message_addr >> 32) & 0xffffffff));
|
|
||||||
|
|
||||||
// 写入message data
|
|
||||||
tmp = pci_get_arch_msi_message_data(vector, processor, edge_trigger, assert);
|
|
||||||
if (message_control & (1 << 7)) // 64位
|
|
||||||
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0xc, tmp);
|
|
||||||
else
|
|
||||||
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0x8, tmp);
|
|
||||||
|
|
||||||
// 使能msi
|
|
||||||
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
|
||||||
tmp |= (1 << 16);
|
|
||||||
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr, tmp);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x01: // pci to pci bridge
|
|
||||||
if (!(ptr->Status & 0x10))
|
|
||||||
return E_NOT_SUPPORT_MSI;
|
|
||||||
cap_ptr = ((struct pci_device_structure_pci_to_pci_bridge_t *)ptr)->Capability_Pointer;
|
|
||||||
|
|
||||||
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
|
||||||
|
|
||||||
message_control = (tmp >> 16) & 0xffff;
|
|
||||||
|
|
||||||
if (tmp & 0xff != 0x5)
|
|
||||||
return E_NOT_SUPPORT_MSI;
|
|
||||||
|
|
||||||
// 写入message address
|
|
||||||
message_addr = pci_get_arch_msi_message_address(processor); // 获取message address
|
|
||||||
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0x4, (uint32_t)(message_addr & 0xffffffff));
|
|
||||||
|
|
||||||
if (message_control & (1 << 7)) // 64位
|
|
||||||
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0x8, (uint32_t)((message_addr >> 32) & 0xffffffff));
|
|
||||||
|
|
||||||
// 写入message data
|
|
||||||
tmp = pci_get_arch_msi_message_data(vector, processor, edge_trigger, assert);
|
|
||||||
if (message_control & (1 << 7)) // 64位
|
|
||||||
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0xc, tmp);
|
|
||||||
else
|
|
||||||
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr + 0x8, tmp);
|
|
||||||
|
|
||||||
// 使能msi
|
|
||||||
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
|
||||||
tmp |= (1 << 16);
|
|
||||||
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr, tmp);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 0x02: // pci to card bus bridge
|
|
||||||
return E_NOT_SUPPORT_MSI;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: // 不应该到达这里
|
|
||||||
return E_WRONG_HEADER_TYPE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 在已配置好msi寄存器的设备上,使能msi
|
|
||||||
*
|
|
||||||
* @param header 设备头部
|
|
||||||
* @return int 返回码
|
|
||||||
*/
|
|
||||||
int pci_start_msi(void *header)
|
|
||||||
{
|
|
||||||
struct pci_device_structure_header_t *ptr = (struct pci_device_structure_header_t *)header;
|
|
||||||
uint32_t cap_ptr;
|
|
||||||
uint32_t tmp;
|
|
||||||
|
|
||||||
switch (ptr->HeaderType)
|
|
||||||
{
|
|
||||||
case 0x00: // general device
|
|
||||||
if (!(ptr->Status & 0x10))
|
|
||||||
return E_NOT_SUPPORT_MSI;
|
|
||||||
cap_ptr = ((struct pci_device_structure_general_device_t *)ptr)->Capabilities_Pointer;
|
|
||||||
|
|
||||||
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
|
||||||
|
|
||||||
if (tmp & 0xff != 0x5)
|
|
||||||
return E_NOT_SUPPORT_MSI;
|
|
||||||
|
|
||||||
// 使能msi
|
|
||||||
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
|
||||||
tmp |= (1 << 16);
|
|
||||||
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr, tmp);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x01: // pci to pci bridge
|
|
||||||
if (!(ptr->Status & 0x10))
|
|
||||||
return E_NOT_SUPPORT_MSI;
|
|
||||||
cap_ptr = ((struct pci_device_structure_pci_to_pci_bridge_t *)ptr)->Capability_Pointer;
|
|
||||||
|
|
||||||
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
|
||||||
|
|
||||||
if (tmp & 0xff != 0x5)
|
|
||||||
return E_NOT_SUPPORT_MSI;
|
|
||||||
|
|
||||||
//使能msi
|
|
||||||
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
|
||||||
tmp |= (1 << 16);
|
|
||||||
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr, tmp);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 0x02: // pci to card bus bridge
|
|
||||||
return E_NOT_SUPPORT_MSI;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: // 不应该到达这里
|
|
||||||
return E_WRONG_HEADER_TYPE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief 禁用指定设备的msi
|
|
||||||
*
|
|
||||||
* @param header pci header
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
int pci_disable_msi(void *header)
|
|
||||||
{
|
|
||||||
struct pci_device_structure_header_t *ptr = (struct pci_device_structure_header_t *)header;
|
|
||||||
uint32_t cap_ptr;
|
|
||||||
uint32_t tmp;
|
|
||||||
|
|
||||||
switch (ptr->HeaderType)
|
|
||||||
{
|
|
||||||
case 0x00: // general device
|
|
||||||
if (!(ptr->Status & 0x10))
|
|
||||||
return E_NOT_SUPPORT_MSI;
|
|
||||||
cap_ptr = ((struct pci_device_structure_general_device_t *)ptr)->Capabilities_Pointer;
|
|
||||||
|
|
||||||
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
|
||||||
|
|
||||||
if (tmp & 0xff != 0x5)
|
|
||||||
return E_NOT_SUPPORT_MSI;
|
|
||||||
|
|
||||||
// 禁用msi
|
|
||||||
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
|
||||||
tmp &= (~(1 << 16));
|
|
||||||
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr, tmp);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x01: // pci to pci bridge
|
|
||||||
if (!(ptr->Status & 0x10))
|
|
||||||
return E_NOT_SUPPORT_MSI;
|
|
||||||
cap_ptr = ((struct pci_device_structure_pci_to_pci_bridge_t *)ptr)->Capability_Pointer;
|
|
||||||
|
|
||||||
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
|
||||||
|
|
||||||
if (tmp & 0xff != 0x5)
|
|
||||||
return E_NOT_SUPPORT_MSI;
|
|
||||||
|
|
||||||
//禁用msi
|
|
||||||
tmp = pci_read_config(ptr->bus, ptr->device, ptr->func, cap_ptr); // 读取cap+0x0处的值
|
|
||||||
tmp &= (~(1 << 16));
|
|
||||||
pci_write_config(ptr->bus, ptr->device, ptr->func, cap_ptr, tmp);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 0x02: // pci to card bus bridge
|
|
||||||
return E_NOT_SUPPORT_MSI;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: // 不应该到达这里
|
|
||||||
return E_WRONG_HEADER_TYPE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 获取 device structure
|
* @brief 获取 device structure
|
||||||
|
@ -205,34 +205,7 @@ void* pci_read_header(int *type, uchar bus, uchar slot, uchar func, bool add_to_
|
|||||||
*/
|
*/
|
||||||
void pci_checkAllBuses();
|
void pci_checkAllBuses();
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 启用 Message Signaled Interrupts
|
|
||||||
*
|
|
||||||
* @param header 设备header
|
|
||||||
* @param vector 中断向量号
|
|
||||||
* @param processor 要投递到的处理器
|
|
||||||
* @param edge_trigger 是否边缘触发
|
|
||||||
* @param assert 是否高电平触发
|
|
||||||
*
|
|
||||||
* @return 返回码
|
|
||||||
*/
|
|
||||||
int pci_enable_msi(void * header, uint8_t vector, uint32_t processor, uint8_t edge_trigger, uint8_t assert);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 禁用指定设备的msi
|
|
||||||
*
|
|
||||||
* @param header pci header
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
int pci_disable_msi(void *header);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 在已配置好msi寄存器的设备上,使能msi
|
|
||||||
*
|
|
||||||
* @param header 设备头部
|
|
||||||
* @return int 返回码
|
|
||||||
*/
|
|
||||||
int pci_start_msi(void *header);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 获取 device structure
|
* @brief 获取 device structure
|
||||||
|
10
kernel/driver/timers/Makefile
Normal file
10
kernel/driver/timers/Makefile
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
all: rtc.o HPET.o
|
||||||
|
|
||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
rtc.o: rtc/rtc.c
|
||||||
|
gcc $(CFLAGS) -c rtc/rtc.c -o rtc/rtc.o
|
||||||
|
|
||||||
|
HPET.o: HPET/HPET.c
|
||||||
|
gcc $(CFLAGS) -c HPET/HPET.c -o HPET/HPET.o
|
7
kernel/driver/uart/Makefile
Normal file
7
kernel/driver/uart/Makefile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
all: uart.o
|
||||||
|
|
||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
uart.o: uart.c
|
||||||
|
gcc $(CFLAGS) -c uart.c -o uart.o
|
@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <driver/usb/usb.h>
|
#include <driver/usb/usb.h>
|
||||||
#include <driver/pci/pci.h>
|
#include <driver/pci/pci.h>
|
||||||
|
#include <driver/pci/msi.h>
|
||||||
|
|
||||||
#define XHCI_MAX_HOST_CONTROLLERS 4 // 本驱动程序最大支持4个xhci root hub controller
|
#define XHCI_MAX_HOST_CONTROLLERS 4 // 本驱动程序最大支持4个xhci root hub controller
|
||||||
#define XHCI_MAX_ROOT_HUB_PORTS 128 // 本驱动程序最大支持127个root hub 端口(第0个保留)
|
#define XHCI_MAX_ROOT_HUB_PORTS 128 // 本驱动程序最大支持127个root hub 端口(第0个保留)
|
||||||
|
18
kernel/exception/Makefile
Normal file
18
kernel/exception/Makefile
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
|
||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
|
||||||
|
all: entry.o irq.o softirq.o trap.o
|
||||||
|
|
||||||
|
entry.o: entry.S
|
||||||
|
gcc -E entry.S > entry.s
|
||||||
|
as $(ASFLAGS) -o entry.o entry.s
|
||||||
|
|
||||||
|
trap.o: trap.c
|
||||||
|
gcc $(CFLAGS) -c trap.c -o trap.o
|
||||||
|
|
||||||
|
softirq.o: softirq.c
|
||||||
|
gcc $(CFLAGS) -c softirq.c -o softirq.o
|
||||||
|
|
||||||
|
irq.o: irq.c
|
||||||
|
gcc $(CFLAGS) -c irq.c -o irq.o
|
12
kernel/mm/Makefile
Normal file
12
kernel/mm/Makefile
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
|
||||||
|
all:mm.o slab.o
|
||||||
|
|
||||||
|
mm.o: mm.c
|
||||||
|
gcc $(CFLAGS) -c mm.c -o mm.o
|
||||||
|
|
||||||
|
slab.o: slab.c
|
||||||
|
gcc $(CFLAGS) -c slab.c -o slab.o
|
||||||
|
|
8
kernel/sched/Makefile
Normal file
8
kernel/sched/Makefile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
|
||||||
|
all: sched.o
|
||||||
|
|
||||||
|
sched.o: sched.c
|
||||||
|
gcc $(CFLAGS) -c sched.c -o sched.o
|
13
kernel/smp/Makefile
Normal file
13
kernel/smp/Makefile
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
|
||||||
|
all: apu_boot.o smp.o
|
||||||
|
|
||||||
|
|
||||||
|
apu_boot.o: apu_boot.S
|
||||||
|
gcc -E apu_boot.S > apu_boot.s # 预处理
|
||||||
|
as $(ASFLAGS) -o apu_boot.o apu_boot.s
|
||||||
|
|
||||||
|
smp.o: smp.c
|
||||||
|
gcc $(CFLAGS) -c smp.c -o smp.o
|
8
kernel/syscall/Makefile
Normal file
8
kernel/syscall/Makefile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
|
||||||
|
all: syscall.o
|
||||||
|
|
||||||
|
syscall.o: syscall.c
|
||||||
|
gcc $(CFLAGS) -c syscall.c -o syscall.o
|
Loading…
x
Reference in New Issue
Block a user