本节介绍已更改的 DDI 函数参数数据类型。
struct buf *getrbuf(int sleepflag);
在以前的发行版中,sleepflag 被定义为 long
类型。
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)。
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
。
struct map *rmallocmap(size_t mapsize); struct map *rmallocmap_wait(size_t mapsize);
rmallocmap(9F) 和 rmallocmap_wait(9F) 例程的 mapsize 参数已从 ulong_t
更改为 size_t
。
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
类型。
int uiomove(caddr_t address, size_t nbytes, enum uio_rw rwflag, uio_t *uio_p);
nbytes 参数被定义为 long
类型,但是由于 nbytes 以字节为单位表示大小,因此 size_t
更适合。
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
更适合。
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_advcnt、dev_datasz 参数的类型已更改。这些参数以前分别被定义为 long
、long
和 ulong_t
类型。
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
类型。
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);
在以前的发行版中,length、flags 和 real_length 分别被定义为 uint_t
、ulong_t
和 uint_t *
类型。