i386_copy.c revision 39441
138712Smsmith/* 238712Smsmith * mjs copyright 338712Smsmith */ 438712Smsmith/* 538712Smsmith * MD primitives supporting placement of module data 638712Smsmith * 738712Smsmith * XXX should check load address/size against memory top. 838712Smsmith */ 938712Smsmith#include <stand.h> 1038712Smsmith 1138712Smsmith#include "libi386.h" 1239441Smsmith#include "btxv86.h" 1338712Smsmith 1438712Smsmith#define READIN_BUF 4096 1538712Smsmith 1638712Smsmithint 1738712Smsmithi386_copyin(void *src, vm_offset_t dest, size_t len) 1838712Smsmith{ 1939441Smsmith if (dest + len >= memtop) 2039441Smsmith return(0); 2139441Smsmith 2239441Smsmith bcopy(src, PTOV(dest), len); 2338712Smsmith return(len); 2438712Smsmith} 2538712Smsmith 2638712Smsmithint 2738764Smsmithi386_copyout(vm_offset_t src, void *dest, size_t len) 2838764Smsmith{ 2939441Smsmith if (src + len >= memtop) 3039441Smsmith return(0); 3139441Smsmith 3239441Smsmith bcopy(PTOV(src), dest, len); 3338764Smsmith return(len); 3438764Smsmith} 3538764Smsmith 3638764Smsmith 3738764Smsmithint 3838712Smsmithi386_readin(int fd, vm_offset_t dest, size_t len) 3938712Smsmith{ 4038712Smsmith void *buf; 4138712Smsmith size_t resid, chunk, get, got; 4238712Smsmith 4339441Smsmith if (dest + len >= memtop) 4439441Smsmith return(0); 4539441Smsmith 4638712Smsmith chunk = min(READIN_BUF, len); 4738712Smsmith buf = malloc(chunk); 4838712Smsmith if (buf == NULL) 4938712Smsmith return(0); 5038712Smsmith 5138712Smsmith for (resid = len; resid > 0; resid -= got, dest += got) { 5238712Smsmith get = min(chunk, resid); 5338712Smsmith got = read(fd, buf, get); 5438712Smsmith if (got <= 0) 5538712Smsmith break; 5639441Smsmith bcopy(buf, PTOV(dest), chunk); 5738712Smsmith } 5838712Smsmith free(buf); 5938712Smsmith return(len - resid); 6038712Smsmith} 6138712Smsmith 6238712Smsmith 63