本文整理汇总了C++中phys_copy函数的典型用法代码示例。如果您正苦于以下问题:C++ phys_copy函数的具体用法?C++ phys_copy怎么用?C++ phys_copy使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了phys_copy函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: dp_pio16_user2nic
/*
** Name: void dp_pio16_user2nic(dpeth_t *dep, int pageno, int pktsize)
** Function: Copies a packet from user area to board (Prog. I/O, 16bits).
*/
static void dp_pio16_user2nic(dpeth_t *dep, int pageno, int pktsize)
{
u8_t two_bytes[2];
phys_bytes phys_user, phys_2bytes = vir2phys(two_bytes);
vir_bytes ecount = (pktsize + 1) & NOT(0x0001);
int bytes, ix = 0, odd_byte = 0;
iovec_dat_t *iovp = &dep->de_write_iovec;
outb_reg0(dep, DP_ISR, ISR_RDC);
dp_read_setup(dep, ecount, pageno * DP_PAGESIZE);
do {
bytes = iovp->iod_iovec[ix].iov_size;
if (bytes > pktsize) bytes = pktsize;
phys_user = numap(iovp->iod_proc_nr, iovp->iod_iovec[ix].iov_addr, bytes);
if (!phys_user) panic(UmapErrMsg);
if (odd_byte) {
phys_copy(phys_user, phys_2bytes + 1, (phys_bytes) 1);
out_word(dep->de_data_port, *(u16_t *)two_bytes);
pktsize--;
bytes--;
phys_user++;
odd_byte = 0;
if (!bytes) continue;
}
ecount = bytes & NOT(0x0001);
if (ecount != 0) {
phys_outsw(dep->de_data_port, phys_user, ecount);
pktsize -= ecount;
bytes -= ecount;
phys_user += ecount;
}
if (bytes) {
phys_copy(phys_user, phys_2bytes, (phys_bytes) 1);
pktsize--;
bytes--;
phys_user++;
odd_byte = 1;
}
if (++ix >= IOVEC_NR) { /* Next buffer of I/O vector */
dp_next_iovec(iovp);
ix = 0;
}
} while (bytes > 0);
if (odd_byte) out_word(dep->de_data_port, *(u16_t *) two_bytes);
for (ix = 0; ix < 100; ix++) {
if (inb_reg0(dep, DP_ISR) & ISR_RDC) break;
}
if (ix == 100) {
panic(RdmaErrMsg);
}
return;
}
开发者ID:andreasbock,项目名称:minix,代码行数:61,代码来源:8390.c
示例2: dp_pio16_nic2user
/*
** Name: void dp_pio16_nic2user(dpeth_t *dep, int pageno, int pktsize)
** Function: Copies a packet from board to user area (Prog. I/O, 16bits).
*/
static void dp_pio16_nic2user(dpeth_t * dep, int nic_addr, int count)
{
phys_bytes phys_user;
vir_bytes ecount;
int bytes, i;
u8_t two_bytes[2];
phys_bytes phys_2bytes;
int odd_byte;
ecount = (count + 1) & ~1;
phys_2bytes = vir2phys(two_bytes);
odd_byte = 0;
dp_read_setup(dep, ecount, nic_addr);
i = 0;
while (count > 0) {
if (i >= IOVEC_NR) {
dp_next_iovec(iovp);
i = 0;
continue;
}
bytes = iovp->iod_iovec[i].iov_size;
if (bytes > count) bytes = count;
phys_user = numap(iovp->iod_proc_nr,
iovp->iod_iovec[i].iov_addr, bytes);
if (!phys_user) panic(UmapErrMsg);
if (odd_byte) {
phys_copy(phys_2bytes + 1, phys_user, (phys_bytes) 1);
count--;
bytes--;
phys_user++;
odd_byte = 0;
if (!bytes) continue;
}
ecount = bytes & ~1;
if (ecount != 0) {
phys_insw(dep->de_data_port, phys_user, ecount);
count -= ecount;
bytes -= ecount;
phys_user += ecount;
}
if (bytes) {
*(u16_t *) two_bytes = in_word(dep->de_data_port);
phys_copy(phys_2bytes, phys_user, (phys_bytes) 1);
count--;
bytes--;
phys_user++;
odd_byte = 1;
}
}
return;
}
开发者ID:andreasbock,项目名称:minix,代码行数:58,代码来源:8390.c
示例3: do_stat
/*****************************************************************************
* do_stat
*************************************************************************//**
* Perform the stat() syscall.
*
* @return On success, zero is returned. On error, -1 is returned.
*****************************************************************************/
PUBLIC int do_stat()
{
char pathname[MAX_PATH]; /* parameter from the caller */
char filename[MAX_PATH]; /* directory has been stipped */
/* get parameters from the message */
int name_len = fs_msg.NAME_LEN; /* length of filename */
int src = fs_msg.source; /* caller proc nr. */
assert(name_len < MAX_PATH);
phys_copy((void*)va2la(TASK_FS, pathname), /* to */
(void*)va2la(src, fs_msg.PATHNAME), /* from */
name_len);
pathname[name_len] = 0; /* terminate the string */
int inode_nr = search_file(pathname);
if (inode_nr == INVALID_INODE) { /* file not found */
printl("{FS} FS::do_stat():: search_file() returns "
"invalid inode: %s\n", pathname);
return -1;
}
struct inode * pin = 0;
struct inode * dir_inode;
if (strip_path(filename, pathname, &dir_inode) != 0) {
/* theoretically never fail here
* (it would have failed earlier when
* search_file() was called)
*/
assert(0);
}
pin = get_inode(dir_inode->i_dev, inode_nr);
struct stat s; /* the thing requested */
s.st_dev = pin->i_dev;
s.st_ino = pin->i_num;
s.st_mode= pin->i_mode;
s.st_rdev= is_special(pin->i_mode) ? pin->i_start_sect : NO_DEV;
s.st_size= pin->i_size;
put_inode(pin);
phys_copy((void*)va2la(src, fs_msg.BUF), /* to */
(void*)va2la(TASK_FS, &s), /* from */
sizeof(struct stat));
return 0;
}
开发者ID:speedjiu,项目名称:tiny_os,代码行数:55,代码来源:misc.c
示例4: cons_setc
PRIVATE void cons_setc(const int pos, const int c)
{
char ch;
ch= c;
phys_copy(vir2phys((vir_bytes)&ch), COLOR_BASE+(20*80+pos)*2, 1);
}
开发者ID:bdunlay,项目名称:os-projects,代码行数:7,代码来源:arch_system.c
示例5: arch_get_params
PUBLIC int arch_get_params(char *params, int maxsize)
{
phys_copy(seg2phys(mon_ds) + params_offset, vir2phys(params),
MIN(maxsize, params_size));
params[maxsize-1] = '\0';
return OK;
}
开发者ID:chanddu,项目名称:MINIX,代码行数:7,代码来源:arch_system.c
示例6: arch_get_aout_headers
PUBLIC void arch_get_aout_headers(const int i, struct exec *h)
{
/* The bootstrap loader created an array of the a.out headers at
* absolute address 'aout'. Get one element to h.
*/
phys_copy(aout + i * A_MINHDR, vir2phys(h), (phys_bytes) A_MINHDR);
}
开发者ID:bdunlay,项目名称:os-projects,代码行数:7,代码来源:arch_system.c
示例7: copy_mem
////复制父进程的地址空间
static int copy_mem(int pid,struct task_struct *p)
{
struct descriptor *dp = &proc_table[pid].ldts[INDEX_LDT_C];
int text_base = get_base(dp);
int text_limit = get_limit(dp);
int text_size = (text_limit + 1) * ((dp->limit_high_attr2 * 0x80)?4096:1);
dp = &proc_table[pid].ldts[INDEX_LDT_D];
int data_base = get_base(dp);
int data_limit= get_limit(dp);
int data_size = (text_limit + 1) * ((dp->limit_high_attr2 * 0x80)?4096:1);
assert((text_base == data_base) &&
(text_limit == data_limit) &&
(text_size == data_size)
);
int child_base = alloc_mem(p->pid,text_size);
// printk("child_base = %d\t text_base = %d\t text_size = %d\n",child_base,text_base,text_size);
// memcpy((void *)child_base,(void *)(text_base),text_size);
// printk("child_base = %d\t text_base = %d\t text_size = %d\n",child_base,text_base,text_size);
phys_copy((char *)child_base,(char *)(text_base),text_size);
return child_base;
}
开发者ID:monomaniar,项目名称:prettyos,代码行数:27,代码来源:fork.c
示例8: hd_rdwt
/**
* <Ring 1> This routine handles DEV_READ and DEV_WRITE message.
*
* @param p Message ptr.
*****************************************************************************/
PRIVATE void hd_rdwt(MESSAGE * p)
{
// p->DEVICE 為 0x20,也就是 hd2a
int pDev = p->DEVICE;
int drive = DRV_OF_DEV(p->DEVICE);
u64 pos = p->POSITION;
assert((pos >> SECTOR_SIZE_SHIFT) < (1 << 31));
/**
* We only allow to R/W from a SECTOR boundary:
*/
assert((pos & 0x1FF) == 0);
u32 sect_nr = (u32)(pos >> SECTOR_SIZE_SHIFT); /* pos / SECTOR_SIZE */
//取出logic index
int logidx = (p->DEVICE - MINOR_hd1a) % NR_SUB_PER_DRIVE;
// 找出某個partition的LBA,
// MAX_PRIM=9,代表Hd0~Hd9為primary的編號,超過9以上的編號都是logic
sect_nr += p->DEVICE < MAX_PRIM ?
hd_info[drive].primary[p->DEVICE].base :
hd_info[drive].logical[logidx].base;
ERIC_HD("\nHDRW=%x", sect_nr);
struct hd_cmd cmd;
cmd.features = 0;
cmd.count = (p->CNT + SECTOR_SIZE - 1) / SECTOR_SIZE;
cmd.lba_low = sect_nr & 0xFF;
cmd.lba_mid = (sect_nr >> 8) & 0xFF;
cmd.lba_high= (sect_nr >> 16) & 0xFF;
cmd.device = MAKE_DEVICE_REG(1, drive, (sect_nr >> 24) & 0xF);
cmd.command = (p->type == DEV_READ) ? ATA_READ : ATA_WRITE;
hd_cmd_out(&cmd);
int bytes_left = p->CNT;
void * la = (void*)va2la(p->PROC_NR, p->BUF);
while (bytes_left) {
//一次只讀512 byte
int bytes = min(SECTOR_SIZE, bytes_left);
if (p->type == DEV_READ) {
interrupt_wait();
port_read(REG_DATA, hdbuf, SECTOR_SIZE);
phys_copy(la, (void*)va2la(TASK_HD, hdbuf), bytes);
}
else {
if (!waitfor(STATUS_DRQ, STATUS_DRQ, HD_TIMEOUT))
panic("hd writing error.");
port_write(REG_DATA, la, bytes);
interrupt_wait();
}
bytes_left -= SECTOR_SIZE;
la += SECTOR_SIZE;
}
}
开发者ID:wwssllabcd,项目名称:myOS,代码行数:65,代码来源:hd.c
示例9: arch_set_params
PUBLIC int arch_set_params(char *params, int size)
{
if(size > params_size)
return E2BIG;
phys_copy(vir2phys(params), seg2phys(mon_ds) + params_offset, size);
return OK;
}
开发者ID:chanddu,项目名称:MINIX,代码行数:7,代码来源:arch_system.c
示例10: msg_send
/**************************************************************************************************
* msg_send
**************************************************************************************************
* <Ring 0> Send a message to the dest proc. If dest is blocked waiting for the message,
* copy the message to it and unblock dest.
* Otherwise the caller will be blocked and appended to the dest's sending queue.
*
* @param current The caller, the sender.
* @param dest To whom the message is sent.
* @param msg Pointer to the MESSAGE struct.
*
* @return 0 if success.
*************************************************************************************************/
PRIVATE int msg_send(PROCESS* current, int dest, MESSAGE* msg){
PROCESS* sender = current;
PROCESS* p_dest = proc_table + dest;
assert(proc2pid(sender) != dest);
if(deadlock(proc2pid(sender), dest)){ /* Is there deadlock chain? */
panic(">>DEADLOCK<< %s->%s", sender->name, p_dest->name);
}
/* dest is waiting for that msg or ANY msg. */
if((p_dest->flags & RECEIVING) && (p_dest->recv_from == proc2pid(sender) || p_dest->recv_from == ANY)){
assert(p_dest->p_msg);
assert(msg);
phys_copy(va2la(dest, p_dest->p_msg), va2la(proc2pid(sender), msg), sizeof(MESSAGE));
p_dest->p_msg = 0;
p_dest->flags &= ~RECEIVING; /* dest has received the message */
p_dest->recv_from = NO_TASK;
unblock(p_dest);
assert(p_dest->flags == 0);
assert(p_dest->p_msg == 0);
assert(p_dest->recv_from == NO_TASK);
assert(p_dest->send_to == NO_TASK);
assert(sender->flags == 0);
assert(sender->p_msg == 0);
assert(sender->recv_from == NO_TASK);
assert(sender->send_to == NO_TASK);
}else{ /* However, dest is not waiting for the message */
sender->flags |= SENDING;
assert(sender->flags == SENDING);
sender->send_to = dest;
sender->p_msg = msg;
/* append to the sending queue */
PROCESS* p;
if(p_dest->q_sending){
p = p_dest->q_sending;
while(p->next_sending){
p = p->next_sending;
}
p->next_sending = sender;
}else{
p_dest->q_sending = sender;
}
sender->next_sending = 0;
block(sender);
assert(sender->flags == SENDING);
assert(sender->p_msg != 0);
assert(sender->recv_from == NO_TASK);
assert(sender->send_to == dest);
}
return 0;
}
开发者ID:liangbizhi,项目名称:bzOS,代码行数:70,代码来源:proc.c
示例11: intr_init
/*===========================================================================*
* intr_init *
*===========================================================================*/
PUBLIC int intr_init(const int mine, const int auto_eoi)
{
/* Initialize the 8259s, finishing with all interrupts disabled. This is
* only done in protected mode, in real mode we don't touch the 8259s, but
* use the BIOS locations instead. The flag "mine" is set if the 8259s are
* to be programmed for MINIX, or to be reset to what the BIOS expects.
*/
/* The AT and newer PS/2 have two interrupt controllers, one master,
* one slaved at IRQ 2. (We don't have to deal with the PC that
* has just one controller, because it must run in real mode.)
*/
outb( INT_CTL, machine.ps_mca ? ICW1_PS : ICW1_AT);
outb( INT_CTLMASK, mine == INTS_MINIX ? IRQ0_VECTOR : BIOS_IRQ0_VEC);
/* ICW2 for master */
outb( INT_CTLMASK, (1 << CASCADE_IRQ));
/* ICW3 tells slaves */
if (auto_eoi)
outb( INT_CTLMASK, ICW4_AT_AEOI_MASTER);
else
outb( INT_CTLMASK, ICW4_AT_MASTER);
outb( INT_CTLMASK, ~(1 << CASCADE_IRQ)); /* IRQ 0-7 mask */
outb( INT2_CTL, machine.ps_mca ? ICW1_PS : ICW1_AT);
outb( INT2_CTLMASK, mine == INTS_MINIX ? IRQ8_VECTOR : BIOS_IRQ8_VEC);
/* ICW2 for slave */
outb( INT2_CTLMASK, CASCADE_IRQ); /* ICW3 is slave nr */
if (auto_eoi)
outb( INT2_CTLMASK, ICW4_AT_AEOI_SLAVE);
else
outb( INT2_CTLMASK, ICW4_AT_SLAVE);
outb( INT2_CTLMASK, ~0); /* IRQ 8-15 mask */
/* Copy the BIOS vectors from the BIOS to the Minix location, so we
* can still make BIOS calls without reprogramming the i8259s.
*/
#if IRQ0_VECTOR != BIOS_IRQ0_VEC
phys_copy(BIOS_VECTOR(0) * 4L, VECTOR(0) * 4L, 8 * 4L);
#endif
#if IRQ8_VECTOR != BIOS_IRQ8_VEC
phys_copy(BIOS_VECTOR(8) * 4L, VECTOR(8) * 4L, 8 * 4L);
#endif
return OK;
}
开发者ID:biswajit1983,项目名称:minix-nbsd,代码行数:47,代码来源:i8259.c
示例12: hd_rdwt
/*
* <ring 1> this routine handles DEV_READ and DEV_WRITE message.
*
* @param msg - message
*/
static void hd_rdwt(MESSAGE *msg)
{
int drive = DRV_OF_DEV(msg->DEVICE);
u64 pos = msg->POSITION;
assert((pos >> SECTOR_SIZE_SHIFT) < (1 << 31));
assert((pos & 0x1ff) == 0);
u32 sect_nr = (u32)(pos >> SECTOR_SIZE_SHIFT);
int logidx = (msg->DEVICE - MINOR_hd1a) % NR_SUB_PER_DRIVE;
sect_nr += msg->DEVICE < MAX_PRIM ?
hd_info[drive].primary[msg->DEVICE].base :
hd_info[drive].logical[logidx].base;
struct hd_cmd cmd;
cmd.features = 0;
cmd.count = (msg->CNT + SECTOR_SIZE - 1) / SECTOR_SIZE;
cmd.lba_low = sect_nr & 0xff;
cmd.lba_mid = (sect_nr >> 8) & 0xff;
cmd.lba_high = (sect_nr >> 16) & 0xff;
cmd.device = MAKE_DEVICE_REG(1, drive, (sect_nr >> 24) & 0xf);
cmd.command = (msg->type == DEV_READ) ? ATA_READ : ATA_WRITE;
hd_cmd_out(&cmd);
int bytes_left = msg->CNT;
void *la = (void*)va2la(msg->PROC_NR, msg->BUF);
while (bytes_left > 0)
{
int bytes = min(SECTOR_SIZE, bytes_left);
if (msg->type == DEV_READ)
{
interrupt_wait();
port_read(REG_DATA, hdbuf, SECTOR_SIZE);
phys_copy(la, (void*)va2la(TASK_HD, hdbuf), bytes);
}
else
{
if (!waitfor(STATUS_DRQ, STATUS_DRQ, HD_TIMEOUT))
{
panic("hd writing error.");
}
port_write(REG_DATA, la, bytes);
interrupt_wait();
}
bytes_left -= SECTOR_SIZE;
la += SECTOR_SIZE;
}
}
开发者ID:cosail,项目名称:lwos,代码行数:58,代码来源:hd.c
示例13: db_write_bytes
/*
* Write bytes to task address space for debugger.
*/
void
db_write_bytes(
vm_offset_t addr,
int size,
char *data,
task_t task)
{
int n,max;
addr64_t phys_dst;
addr64_t phys_src;
pmap_t pmap;
while (size > 0) {
phys_src = db_vtophys(kernel_pmap, (vm_offset_t)data);
if (phys_src == 0) {
db_printf("\nno memory is assigned to src address %08x\n",
data);
db_error(0);
/* NOTREACHED */
}
/* space stays as kernel space unless in another task */
if (task == NULL) pmap = kernel_pmap;
else pmap = task->map->pmap;
phys_dst = db_vtophys(pmap, (vm_offset_t)addr);
if (phys_dst == 0) {
db_printf("\nno memory is assigned to dst address %08x\n",
addr);
db_error(0);
/* NOTREACHED */
}
/* don't over-run any page boundaries - check src range */
max = round_page_64(phys_src + 1) - phys_src;
if (max > size)
max = size;
/* Check destination won't run over boundary either */
n = round_page_64(phys_dst + 1) - phys_dst;
if (n < max)
max = n;
size -= max;
addr += max;
phys_copy(phys_src, phys_dst, max);
/* resync I+D caches */
sync_cache64(phys_dst, max);
phys_src += max;
phys_dst += max;
}
}
开发者ID:OpenDarwin-CVS,项目名称:SEDarwin,代码行数:56,代码来源:db_interface.c
示例14: hykdo_stat
/**************************************************************
* do_stat
**************************************************************
@function:get the information of a pathname
The information we need for stat hided in the inode. So we just need to get the info of inode of pathname.
@input:
@return:0 if sucess
**************************************************************/
int hykdo_stat()
{
char filename[MAX_FILENAME_LEN];
char pathname[MAX_PATH_LEN];
int pathname_len = fs_msg.NAME_LEN;
int src = fs_msg.source;
// pathname = fs_msg.PATHNAME; /*no!!! you can not do this directly! For they are not in the same address space*/
phys_copy( (void *)va2la(TASK_FS, pathname),\
(void *)va2la(src, fs_msg.PATHNAME),\
fs_msg.NAME_LEN);
pathname[pathname_len] = 0;
int inode_nr_path = search_file(pathname);
if(inode_nr_path == INVALID_INODE) {
printl("[FS]:stat faild becase of invalid inode\n");
return -1;
}
struct inode *dir_inode;
if(strip_path(filename, pathname, &dir_inode)!=0) {
assert(0);
}
struct inode *file_inode=get_inode(dir_inode->i_dev, inode_nr_path);
struct stat s;
s.dev = file_inode->i_dev;
s.size = file_inode->i_size;
s.mode = file_inode->i_mode;
s.ino = file_inode->i_num;
s.rdev = is_special(file_inode->i_mode) ? file_inode->i_start_sect: NO_DEV;
put_inode(file_inode);
phys_copy( (void *)va2la(src, fs_msg.BUF),\
(void *)va2la(TASK_FS, &stat),\
sizeof(struct stat));
printl("fs_msg.buf.size:%x", ((struct stat *)va2la(src, fs_msg.BUF))->size);
return 0;
}
开发者ID:huangyukun2012,项目名称:DIY_kernel,代码行数:46,代码来源:misc.c
示例15: do_disklog
/**
* Perform syslog() system call .
*
* @return
*****************************************************************************/
PUBLIC int do_disklog()
{
char buf[STR_DEFAULT_LEN];
/* get parameters from the message */
int str_len = fs_msg.CNT; /* length of filename */
int src = fs_msg.source; /* caller proc nr. */
assert(str_len < STR_DEFAULT_LEN);
phys_copy((void*)va2la(TASK_FS, buf), /* to */
(void*)va2la(src, fs_msg.BUF), /* from */
str_len);
buf[str_len] = 0; /* terminate the string */
return disklog(buf);
}
开发者ID:wwssllabcd,项目名称:myOS,代码行数:20,代码来源:disklog.c
示例16: arch_bios_poweroff
PRIVATE __dead void arch_bios_poweroff(void)
{
u32_t cr0;
/* Disable paging */
cr0 = read_cr0();
cr0 &= ~I386_CR0_PG;
write_cr0(cr0);
/* Copy 16-bit poweroff code to below 1M */
phys_copy(
(u32_t)&poweroff16,
BIOS_POWEROFF_ENTRY,
(u32_t)&poweroff16_end-(u32_t)&poweroff16);
poweroff_jmp();
}
开发者ID:chanddu,项目名称:MINIX,代码行数:15,代码来源:arch_system.c
示例17: phys_get32
static u32_t phys_get32(phys_bytes addr)
{
const u32_t v;
int r;
if(!vm_running) {
phys_copy(addr, vir2phys(&v), sizeof(v));
return v;
}
if((r=lin_lin_copy(NULL, addr,
proc_addr(SYSTEM), vir2phys(&v), sizeof(v))) != OK) {
panic("lin_lin_copy for phys_get32 failed: %d", r);
}
return v;
}
开发者ID:Sciumo,项目名称:minix,代码行数:17,代码来源:memory.c
示例18: hd_ioctl
PRIVATE void hd_ioctl(MESSAGE *p)
{
int device = p->DEVICE;
int drive = DRV_OF_DEV(device);
struct hd_info *hdi = &hdinfo[drive];
if (p->REQUEST == DIOCTL_GET_GEO) {
void *dst = va2la(p->PROC_NR, p->BUF);
void *src = va2la(TASK_HD,
device < MAX_PRIM ?
&hdi->primary[device] :
&hdi->logical[(device - MINOR_hd1a) % NR_SUB_PER_DRIVE]);
phys_copy(dst, src, sizeof (struct part_info));
} else {
kprintf("[KERNEL ERROR]error ioctl cmd\n");
}
}
开发者ID:yankaifyyy,项目名称:Owindy-S,代码行数:18,代码来源:hd.c
示例19: hd_rdwt
PRIVAATE void hd_rdwt(MESSAGE *p)
{
int drive = DRV_OF_DEV(p->DEVICE);
u64_t pos = p->POSITION;
u32_t sect_nr = (u32_t)(pos >> SECTOR_SIZE_SHIFT);
int logidx = (p->DEVICE - MINOR_HD1a) % NR_SUB_PER_DRIVE;
sect_nr += p->DEVICE < MAX_PRIM ?
hd_info[drive].primary[p->DEVICE].base :
hd_info[drive].logical[logidx].base;
struct hd_cmd cmd;
cmd.features = 0;
cmd.count = (p->CNT + SECTOR_SIZE - 1) / SECTOR_SIZE;
cmd.lba_low = sect_nr & 0xff;
cmd.lba_mid = (sect_nr >> 8) & 0xff;
cmd.lba_high = (sect_nr >> 16) & 0xff;
cmd.device = MAKE_DEVICE_REG(1, drive, (sect_nr >> 24) & 0xf);
cmd.command = (p->type == DEV_READ) ? ATA_READ : ATA_WRITE;
hd_cmd_out(&cmd);
int bytes_left = p->CNT;
void *la = (void*)va2la(p->PROC_NR, p->BUF);
while (bytes_left) {
int bytes = min(SECTOR_SIZE, bytes_left);
if (p->type == DEV_READ) {
interrupt_wait();
port_read(REG_DATA, hdbuf, SECTOR_SIZE);
phys_copy(la, (void*)va2la(TASK_HD, hdbuf), bytes);
} else {
if (!waitfor(STATUS_DRQ, STATUS_DRQ, HD_TIMEOUT)) {
kprintf("[KERNEL ERROR]hd writing error.\n");
break;
}
port_write(REG_DATA, la, bytes);
interrupt_wait();
}
bytes_left -= SECTOR_SIZE;
la += SECTOR_SIZE;
}
}
开发者ID:yankaifyyy,项目名称:Owindy-S,代码行数:44,代码来源:hd.c
示例20: tty_do_write
/**
* Invoked when task TTY receives DEV_WRITE message.
*
* @param tty To which TTY the calller proc is bound.
* @param msg The MESSAGE.
*****************************************************************************/
PRIVATE void tty_do_write(TTY* tty, MESSAGE* msg)
{
char buf[TTY_OUT_BUF_LEN];
char * p = (char*)va2la(msg->PROC_NR, msg->BUF);
int i = msg->CNT;
int j;
while (i) {
int bytes = min(TTY_OUT_BUF_LEN, i);
phys_copy(va2la(TASK_TTY, buf), (void*)p, bytes);
for (j = 0; j < bytes; j++)
out_char(tty->console, buf[j]);
i -= bytes;
p += bytes;
}
msg->type = SYSCALL_RET;
send_recv(SEND, msg->source, msg);
}
开发者ID:wsxiaoys,项目名称:OS-Practice,代码行数:25,代码来源:tty.c
注:本文中的phys_copy函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论