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