编写设备驱动程序

检查 DDI 函数中更改的参数

本节介绍已更改的 DDI 函数参数数据类型。

getrbuf() 参数更改

struct buf *getrbuf(int sleepflag);

在以前的发行版中,sleepflag 被定义为 long 类型。

drv_getparm() 参数更改

int drv_getparm(unsigned int parm, void *value_p);

在以前的发行版中,value_p 被定义为 unsigned long 类型。在 64 位内核中,drv_getparm(9F) 可提取 32 位和 64 位。此接口未定义这些量的数据类型,可能会发生简单的编程错误。

以下新例程提供更安全的替代方法:

clock_t       ddi_get_lbolt(void);
time_t        ddi_get_time(void);
cred_t        *ddi_get_cred(void);
pid_t         ddi_get_pid(void);

强烈要求驱动程序编写人员使用这些例程而不要使用 drv_getparm(9F)

delay()timeout() 参数更改

void delay(clock_t ticks);
timeout_id_t timeout(void (*func)(void *), void *arg, clock_t ticks);

delay(9F)timeout(9F) 例程的 ticks 参数已从 long 更改为 clock_t

rmallocmap()rmallocmap_wait() 参数更改

struct map *rmallocmap(size_t mapsize);
struct map *rmallocmap_wait(size_t mapsize);

rmallocmap(9F)rmallocmap_wait(9F) 例程的 mapsize 参数已从 ulong_t 更改为 size_t

scsi_alloc_consistent_buf() 参数更改

struct buf *scsi_alloc_consistent_buf(struct scsi_address *ap,
    struct buf *bp, size_t datalen, uint_t bflags,
    int (*callback )(caddr_t), caddr_t arg);

在以前的发行版中,datalen 被定义为 int 类型,bflags 被定义为 ulong 类型。

uiomove() 参数更改

int uiomove(caddr_t address, size_t nbytes,
    enum uio_rw rwflag, uio_t *uio_p);

nbytes 参数被定义为 long 类型,但是由于 nbytes 以字节为单位表示大小,因此 size_t 更适合。

cv_timedwait()cv_timedwait_sig() 参数更改

int cv_timedwait(kcondvar_t *cvp, kmutex_t *mp, clock_t timeout);
int cv_timedwait_sig(kcondvar_t *cvp, kmutex_t *mp,    clock_t timeout);

在以前的发行版中,cv_timedwait(9F)cv_timedwait_sig(9F) 例程的 timeout 参数被定义为 long 类型。由于这些例程表示时间周期,因此 clock_t 更适合。

ddi_device_copy() 参数更改

int ddi_device_copy(ddi_acc_handle_t src_handle,
    caddr_t src_addr, ssize_t src_advcnt,
    ddi_acc_handle_t dest_handle, caddr_t dest_addr,
    ssize_t dest_advcnt, size_t bytecount, uint_t dev_datasz);

src_advcnt dest_advcntdev_datasz 参数的类型已更改。这些参数以前分别被定义为 longlongulong_t 类型。

ddi_device_zero() 参数更改

int ddi_device_zero(ddi_acc_handle_t handle,
    caddr_t dev_addr, size_t bytecount, ssize_t dev_advcnt,
    uint_t dev_datasz):

在以前的发行版中,dev_advcnt 被定义为 long 类型,dev_datasz 被定义为 ulong_t 类型。

ddi_dma_mem_alloc() 参数更改

int ddi_dma_mem_alloc(ddi_dma_handle_t handle,
    size_t length, ddi_device_acc_attr_t *accattrp,
    uint_t flags, int (*waitfp)(caddr_t), caddr_t arg,
    caddr_t *kaddrp, size_t *real_length,
    ddi_acc_handle_t *handlep);

在以前的发行版中,lengthflagsreal_length 分别被定义为 uint_tulong_tuint_t * 类型。