forked from KolibriOS/kolibrios
- Added the simplest examples of drivers (fasm and kos32-gcc).
- Added a program for testing them. git-svn-id: svn://kolibrios.org@8703 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
caa49e901b
commit
14b216f2e8
9
drivers/examples/asm_drv/Makefile
Normal file
9
drivers/examples/asm_drv/Makefile
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
FASM = fasm
|
||||||
|
KPACK = kpack
|
||||||
|
|
||||||
|
all:
|
||||||
|
$(FASM) asm_drv.asm
|
||||||
|
$(KPACK) asm_drv.sys
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm *.sys
|
61
drivers/examples/asm_drv/asm_drv.asm
Normal file
61
drivers/examples/asm_drv/asm_drv.asm
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
format PE DLL native
|
||||||
|
entry START
|
||||||
|
|
||||||
|
__DEBUG__ = 1
|
||||||
|
__DEBUG_LEVEL__ = 2
|
||||||
|
|
||||||
|
section '.flat' readable writable executable
|
||||||
|
|
||||||
|
include '../../proc32.inc'
|
||||||
|
include '../../struct.inc'
|
||||||
|
include '../../macros.inc'
|
||||||
|
include '../../fdo.inc'
|
||||||
|
|
||||||
|
proc START c, reason:dword
|
||||||
|
|
||||||
|
DEBUGF 2,"Loading 'asm_drv' driver\n"
|
||||||
|
cmp [reason], DRV_ENTRY
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
invoke RegService, my_service, service_proc
|
||||||
|
ret
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
xor eax, eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
endp
|
||||||
|
|
||||||
|
proc service_proc stdcall, ioctl:dword
|
||||||
|
|
||||||
|
mov ebx, [ioctl]
|
||||||
|
mov eax, [ebx + IOCTL.io_code]
|
||||||
|
cmp eax, 0 ; FUNCTION ADD(a+b);
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov eax, [ebx + IOCTL.input]
|
||||||
|
mov ecx, eax
|
||||||
|
add ecx, 4
|
||||||
|
|
||||||
|
mov eax, [eax]
|
||||||
|
add eax, [ecx]
|
||||||
|
|
||||||
|
mov ecx, [ebx + IOCTL.output]
|
||||||
|
mov [ecx], eax
|
||||||
|
|
||||||
|
xor eax, eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
or eax, -1
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
data fixups
|
||||||
|
end data
|
||||||
|
|
||||||
|
include '../../peimport.inc'
|
||||||
|
|
||||||
|
my_service db 'asm_drv',0 ; max 16 chars include zero
|
||||||
|
|
||||||
|
include_debug_strings
|
42
drivers/examples/c_drv/Makefile
Normal file
42
drivers/examples/c_drv/Makefile
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
CC = kos32-gcc
|
||||||
|
LD = kos32-ld
|
||||||
|
KPACK = kpack
|
||||||
|
|
||||||
|
|
||||||
|
DDK_TOPDIR = ../../ddk
|
||||||
|
DRV_INCLUDES = ../../include
|
||||||
|
|
||||||
|
INCLUDES = -I$(DRV_INCLUDES) \
|
||||||
|
-I$(DRV_INCLUDES)/asm \
|
||||||
|
-I$(DRV_INCLUDES)/uapi \
|
||||||
|
-I$(DRV_INCLUDES)/drm
|
||||||
|
NAME=c_drv
|
||||||
|
|
||||||
|
DEFINES = -DKOLIBRI -D__KERNEL__ -DCONFIG_X86_32 -DCONFIG_DMI -DCONFIG_TINY_RCU
|
||||||
|
DEFINES+= -DCONFIG_X86_L1_CACHE_SHIFT=6 -DCONFIG_ARCH_HAS_CACHE_LINE_SIZE
|
||||||
|
DEFINES+= -DCONFIG_PRINTK
|
||||||
|
|
||||||
|
CFLAGS= -c -O2 $(DEFINES) $(INCLUDES) -march=i686 -fno-ident -msse2 -fomit-frame-pointer -fno-builtin-printf
|
||||||
|
CFLAGS+= -mno-stack-arg-probe -mpreferred-stack-boundary=2 -mincoming-stack-boundary=2 -mno-ms-bitfields
|
||||||
|
|
||||||
|
LIBPATH = -L $(DDK_TOPDIR)
|
||||||
|
LIBPATH+= -L ../../../contrib/sdk/lib
|
||||||
|
|
||||||
|
LIBS:= -lddk -lcore -lgcc
|
||||||
|
|
||||||
|
PE_FLAGS = --major-os-version 0 --minor-os-version 7 --major-subsystem-version 0 \
|
||||||
|
--minor-subsystem-version 5 --subsystem native
|
||||||
|
|
||||||
|
LDFLAGS = -nostdlib -shared -s $(PE_FLAGS) --image-base 0\
|
||||||
|
--file-alignment 512 --section-alignment 4096
|
||||||
|
|
||||||
|
all: $(NAME).dll
|
||||||
|
|
||||||
|
$(NAME).dll:
|
||||||
|
$(CC) $(CFLAGS) c_drv.c
|
||||||
|
$(LD) $(LIBPATH) $(LDFLAGS) -T drv.lds c_drv.o -o $@ $(NAME_OBJS) $(LIBS)
|
||||||
|
$(KPACK) $(NAME).dll
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf *.o *.dll
|
||||||
|
|
21
drivers/examples/c_drv/c_drv.c
Normal file
21
drivers/examples/c_drv/c_drv.c
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#include "linux/kernel.h"
|
||||||
|
#include <ddk.h>
|
||||||
|
#include <syscall.h>
|
||||||
|
|
||||||
|
static int __stdcall service_proc(ioctl_t *my_ctl){
|
||||||
|
int c = 0;
|
||||||
|
int a = *(int*)(my_ctl->input);
|
||||||
|
int b = *(int*)(my_ctl->input+4);
|
||||||
|
if(my_ctl->io_code==0){
|
||||||
|
c = a + b;
|
||||||
|
}else{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
*(int*)(my_ctl->output) = c;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned drvEntry(int action, char *cmdline){
|
||||||
|
printk("Driver c_drv.dll loaded!\n");
|
||||||
|
return RegService("c_drv", service_proc);
|
||||||
|
}
|
57
drivers/examples/c_drv/drv.lds
Normal file
57
drivers/examples/c_drv/drv.lds
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
|
||||||
|
|
||||||
|
OUTPUT_FORMAT(pei-i386)
|
||||||
|
|
||||||
|
ENTRY("_drvEntry")
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = SIZEOF_HEADERS;
|
||||||
|
. = ALIGN(__section_alignment__);
|
||||||
|
|
||||||
|
.text __image_base__ + ( __section_alignment__ < 0x1000 ? . : __section_alignment__ ) :
|
||||||
|
|
||||||
|
{
|
||||||
|
*(.text) *(.rdata)
|
||||||
|
}
|
||||||
|
|
||||||
|
.data ALIGN(__section_alignment__) :
|
||||||
|
{
|
||||||
|
*(.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
.bss ALIGN(__section_alignment__):
|
||||||
|
{
|
||||||
|
*(.bss)
|
||||||
|
*(COMMON)
|
||||||
|
}
|
||||||
|
|
||||||
|
/DISCARD/ :
|
||||||
|
{
|
||||||
|
*(.debug$S)
|
||||||
|
*(.debug$T)
|
||||||
|
*(.debug$F)
|
||||||
|
*(.drectve)
|
||||||
|
*(.edata)
|
||||||
|
*(.eh_frame)
|
||||||
|
}
|
||||||
|
|
||||||
|
.idata ALIGN(__section_alignment__):
|
||||||
|
{
|
||||||
|
SORT(*)(.idata$2)
|
||||||
|
SORT(*)(.idata$3)
|
||||||
|
/* These zeroes mark the end of the import list. */
|
||||||
|
LONG (0); LONG (0); LONG (0); LONG (0); LONG (0);
|
||||||
|
SORT(*)(.idata$4)
|
||||||
|
SORT(*)(.idata$5)
|
||||||
|
SORT(*)(.idata$6)
|
||||||
|
SORT(*)(.idata$7)
|
||||||
|
}
|
||||||
|
|
||||||
|
.reloc ALIGN(__section_alignment__) :
|
||||||
|
{
|
||||||
|
*(.reloc)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
12
drivers/examples/test/Makefile
Normal file
12
drivers/examples/test/Makefile
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
KTCC=../../../programs/develop/ktcc/trunk/bin/kos32-tcc
|
||||||
|
KPACK = kpack
|
||||||
|
KLIBC = ../../../programs/develop/libraries/kolibri-libc
|
||||||
|
CFLAGS = -I $(KLIBC)/include
|
||||||
|
LDFLAGS = -nostdlib -L$(KLIBC)/lib $(KLIBC)/lib/crt0.o
|
||||||
|
|
||||||
|
all:
|
||||||
|
$(KTCC) $(CFLAGS) $(LDFLAGS) drv_test.c -o drv_test -lc.obj
|
||||||
|
$(KPACK) --nologo drv_test
|
||||||
|
clean:
|
||||||
|
rm *.kex
|
66
drivers/examples/test/drv_test.c
Normal file
66
drivers/examples/test/drv_test.c
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#include <sys/ksys.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
char* drv_name = NULL;
|
||||||
|
|
||||||
|
struct{
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
}add_struct;
|
||||||
|
|
||||||
|
int sum=0;
|
||||||
|
ksys_drv_hand_t drv = 0;
|
||||||
|
|
||||||
|
#define DRV_ADD_FUNC 0
|
||||||
|
|
||||||
|
int main(int argc, char** argv){
|
||||||
|
puts("Which driver?");
|
||||||
|
puts("1 - asm_drv.sys\n2 - c_drv.dll");
|
||||||
|
int num_drv = (char)getchar()-'0';
|
||||||
|
switch (num_drv) {
|
||||||
|
case 1 :
|
||||||
|
drv_name = "asm_drv";
|
||||||
|
drv = _ksys_load_driver(drv_name);
|
||||||
|
break;
|
||||||
|
case 2 :
|
||||||
|
drv_name = "/rd/1/drivers/c_drv.dll";
|
||||||
|
drv = _ksys_load_pe_driver(drv_name, NULL);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("No driver selected!\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!drv){
|
||||||
|
printf("'%s' driver not load!\n", drv_name);
|
||||||
|
exit(0);
|
||||||
|
}else{
|
||||||
|
printf("'%s' driver is load!\n", drv_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
add_struct.a = 43;
|
||||||
|
add_struct.b = 532;
|
||||||
|
|
||||||
|
ksys_drv_ctl_t ioctl;
|
||||||
|
ioctl.func_num = DRV_ADD_FUNC;
|
||||||
|
ioctl.handler = drv;
|
||||||
|
ioctl.in_data_ptr = &add_struct;
|
||||||
|
ioctl.in_data_size = sizeof(add_struct);
|
||||||
|
ioctl.out_data_ptr = ∑
|
||||||
|
ioctl.out_data_size = sizeof(sum);
|
||||||
|
|
||||||
|
unsigned status =_ksys_work_driver(&ioctl);
|
||||||
|
if(status==-1){
|
||||||
|
puts("Error!");
|
||||||
|
}else {
|
||||||
|
printf("%d + %d = %d\n", add_struct.a, add_struct.b, sum);
|
||||||
|
if(sum == add_struct.a + add_struct.b){
|
||||||
|
puts("True!");
|
||||||
|
}else{
|
||||||
|
puts("False!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exit(0);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user