- 论坛徽章:
- 0
|
写了一个简单的驱动,加载时系统崩溃。请看看有什么问题.
系统环境:
AIX53 ,oslevel -s :5300-06-03-0732
ls -l unix :
/unix -> /usr/lib/boot/unix_64
xlc 8.0
代码:
test.tar.gz
(4.91 KB, 下载次数: 16)
使用方式:
a.cp test64 /usr/lib/drivers/test
b. 加载:./ll -l
c. 卸载:./ll -u
主要问题:
1.在初始化过程中不能使用 splnet ,否则加载驱动系统崩溃。
2.simple_lock_t 的使用:
a. void lock_alloc ( lock_addr, flags, class, occurrence) 的 class,occurrence如何赋值?
b. 初始化过程lock_alloc,simple_lock_init 系统崩溃,lock_alloc失败? 如何正确使用simple_lock_t ?
谢谢各位.
主要代码,驱动入口为 test_main:
#define KMUTEX_T simple_lock_t
#define KRWLOCK_T complex_lock_t
typedef union {
#ifdef KMUTEX_T
struct {
KMUTEX_T test_slk;
char *test_lname;
} test_lkun_s;
#endif
} testmutex_t;
#define test_lk test_lkun_s.test_slk
#define test_lname test_lkun_s.test_lname
#define test_isr test_lkun_s.test_sr
#define test_isw test_lkun_s.test_sw
#define test_magic test_lkun_s.test_magic
# define MUTEX_ENTER(x) simple_lock((x)->test_lk)
# define MUTEX_INIT(x, y) /* pin( &(x)->test_lk );*/\
lock_alloc(&((x)->test_lk), \
LOCK_ALLOC_PIN, \
1, -1 ); \
simple_lock_init((x)->test_lk)
# define MUTEX_DESTROY(x) /* unpin(&(x)->test_lk) ; */\
lock_free(&( (x)->test_lk ))
# define MUTEX_EXIT(x) simple_unlock((x)->test_lk)
int testopen (dev_t, u_long, chan_t, int);
int testclose (dev_t, chan_t);
int testread (dev_t, struct uio *, chan_t, int);
int testwrite (dev_t, struct uio *, chan_t, int);
int testioctl (dev_t devno, int cmd, caddr_t arg, ulong devflag,chan_t chan,int mode);
int test_main(dev_t devno,int cmd,struct uio * uiop );
static testmutex_t test_mutex;
static struct devsw testdevsw = {
testopen, /* d_open entry point for open routine */
testclose, /* d_close entry point for close routine */
testread, /* d_read entry point for read routine */
testwrite, /* d_write entry point for write routine */
testioctl, /* d_ioctl entry point for ioctl routine */
nodev, /* d_strategy entry point for strategy routine */
NULL, /* d_ttys pointer to tty device structure */
nodev, /* d_select entry point for select routine */
test_main, /* d_config entry point for config routine */
nodev, /* d_print entry point for print routine */
nodev, /* d_dump entry point for dump routine */
nodev, /* d_mpx entry point for mpx routine */
nodev, /* d_revoke entry point for revoke routine */
NULL, /* d_dsdptr pointer to device specific data */
NULL, /* d_selptr ptr to outstanding select cntl blks */
DEV_MPSAFE|DEV_64BIT
};
static long test_count = 0;
int init_test(){
bsdlog(LOG_DEBUG|LOG_KERN,"initing test \n");
lock_alloc(&test_mutex.test_lk, LOCK_ALLOC_PIN,512,-1 );
{
bsdlog(LOG_DEBUG|LOG_KERN,"initing......mutex \n");
simple_lock_init(test_mutex.test_lk);
}
bsdlog(LOG_DEBUG|LOG_KERN,"inited \n");
return 0;
}
int test_main(dev_t dev,int cmd,struct uio * uiop )
{
int error = EINVAL;
bsdlog(LOG_DEBUG|LOG_KERN,"test(%u[%d:%d],%d,%p)\n", dev,major_num(dev),minor_num(dev),cmd,uiop);
switch (cmd)
{
case CFG_INIT :
if(error = pincode(testopen) ){
bsdlog(LOG_DEBUG|LOG_KERN,"pincode \n");
return error;
}
error = devswadd(dev, &testdevsw);
if(!error){
error = init_test();
if(error ) unpincode(testopen);
}
break;
case CFG_TERM :
MUTEX_DESTROY(&test_mutex);
error = devswdel(dev);
unpincode(test_main);
break;
case CFG_QVPD :
error = 0;
break;
default :
bsdlog(LOG_DEBUG|LOG_KERN,"test(%ld[%d:%d],%d,%p) invalid cmd\n", dev,major_num(dev),minor_num(dev),cmd,uiop);
error=EINVAL;
break;
}
bsdlog(LOG_DEBUG|LOG_KERN,"test(%ld[%d:%d],%d,%p):%d\n", dev,major_num(dev),minor_num(dev),cmd,uiop,error);
return error;
}
int testopen (dev_t devno, u_long flags, chan_t chan, int ext){
/* int error=EINVAL; */
int error=0;
bsdlog(LOG_DEBUG|LOG_KERN,"testopen(%u[%d:%d],%ld,,)\n", devno,major(devno),minor(devno),flags);
MUTEX_ENTER(&test_mutex);
test_count++;
MUTEX_EXIT(&test_mutex);
return error;
}
int testclose(dev_t devno, chan_t chan){
int error=0;
bsdlog(LOG_DEBUG|LOG_KERN,"testclose(%u[%d:%d])\n", devno,major(devno),minor(devno));
error=0;
}
int testread (dev_t devno, struct uio * uiop, chan_t chan, int ext){
bsdlog(LOG_DEBUG|LOG_KERN,"testread(%u[%d:%d])\n", devno,major(devno),minor(devno));
return ENXIO;
}
int testwrite (dev_t devno, struct uio * uiop, chan_t chan, int ext){
bsdlog(LOG_DEBUG|LOG_KERN,"testwrite(%u[%d:%d])\n", devno,major(devno),minor(devno));
MUTEX_ENTER(&test_mutex);
test_count++;
MUTEX_EXIT(&test_mutex);
return ENXIO;
}
int testioctl (dev_t devno, int cmd, caddr_t data, ulong devflag,chan_t chan,int mode){
bsdlog(LOG_DEBUG|LOG_KERN,"testioctl(%u[%d:%d],%d,%p,%d)\n", devno,major(devno),minor(devno),cmd,data,mode);
return ENXIO;
}
[ 本帖最后由 tsunli 于 2008-8-19 15:57 编辑 ] |
|