Merge zizzer:/bk/m5 into isabel.reinhardt.house:/z/stever/bk/m5
--HG-- extra : convert_revision : 8bfe9a5cb1f127b52e4f189eb1193f7d1c93e580
This commit is contained in:
commit
8f1855034e
|
@ -32,8 +32,9 @@
|
|||
#include <assert.h>
|
||||
|
||||
#include "sim/host.hh"
|
||||
#include "targetarch/kernel.hh"
|
||||
#include "kern/tru64/kernel.hh"
|
||||
#include "base/refcnt.hh"
|
||||
#include "targetarch/vtophys.hh"
|
||||
|
||||
class ExecContext;
|
||||
|
||||
|
@ -129,13 +130,13 @@ class AlphaArguments
|
|||
template <class T>
|
||||
operator T *() {
|
||||
T *buf = (T *)data->alloc(sizeof(T));
|
||||
Kernel::CopyData(xc, buf, getArg(), sizeof(T));
|
||||
CopyData(xc, buf, getArg(), sizeof(T));
|
||||
return buf;
|
||||
}
|
||||
|
||||
operator char *() {
|
||||
char *buf = data->alloc(2048);
|
||||
Kernel::CopyString(xc, buf, getArg(), 2048);
|
||||
CopyString(xc, buf, getArg(), 2048);
|
||||
return buf;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -121,3 +121,103 @@ vtomem(ExecContext *xc, Addr vaddr, size_t len)
|
|||
Addr paddr = vtophys(xc, vaddr);
|
||||
return xc->physmem->dma_addr(paddr, len);
|
||||
}
|
||||
|
||||
void
|
||||
CopyData(ExecContext *xc, void *dest, Addr vaddr, size_t cplen)
|
||||
{
|
||||
Addr paddr;
|
||||
char *dmaaddr;
|
||||
char *dst = (char *)dest;
|
||||
int len;
|
||||
|
||||
paddr = vtophys(xc, vaddr);
|
||||
len = min((int)(ALPHA_PGBYTES - (paddr & PGOFSET)), (int)cplen);
|
||||
dmaaddr = (char *)xc->physmem->dma_addr(paddr, len);
|
||||
assert(dmaaddr);
|
||||
|
||||
memcpy(dst, dmaaddr, len);
|
||||
if (len == cplen)
|
||||
return;
|
||||
|
||||
cplen -= len;
|
||||
dst += len;
|
||||
vaddr += len;
|
||||
|
||||
while (cplen > ALPHA_PGBYTES) {
|
||||
paddr = vtophys(xc, vaddr);
|
||||
dmaaddr = (char *)xc->physmem->dma_addr(paddr, ALPHA_PGBYTES);
|
||||
assert(dmaaddr);
|
||||
|
||||
memcpy(dst, dmaaddr, ALPHA_PGBYTES);
|
||||
cplen -= ALPHA_PGBYTES;
|
||||
dst += ALPHA_PGBYTES;
|
||||
vaddr += ALPHA_PGBYTES;
|
||||
}
|
||||
|
||||
if (cplen > 0) {
|
||||
paddr = vtophys(xc, vaddr);
|
||||
dmaaddr = (char *)xc->physmem->dma_addr(paddr, cplen);
|
||||
assert(dmaaddr);
|
||||
|
||||
memcpy(dst, dmaaddr, cplen);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CopyString(ExecContext *xc, char *dst, Addr vaddr, size_t maxlen)
|
||||
{
|
||||
Addr paddr;
|
||||
char *dmaaddr;
|
||||
int len;
|
||||
|
||||
paddr = vtophys(xc, vaddr);
|
||||
len = min((int)(ALPHA_PGBYTES - (paddr & PGOFSET)), (int)maxlen);
|
||||
dmaaddr = (char *)xc->physmem->dma_addr(paddr, len);
|
||||
assert(dmaaddr);
|
||||
|
||||
char *term = (char *)memchr(dmaaddr, 0, len);
|
||||
if (term)
|
||||
len = term - dmaaddr + 1;
|
||||
|
||||
memcpy(dst, dmaaddr, len);
|
||||
|
||||
if (term || len == maxlen)
|
||||
return;
|
||||
|
||||
maxlen -= len;
|
||||
dst += len;
|
||||
vaddr += len;
|
||||
|
||||
while (maxlen > ALPHA_PGBYTES) {
|
||||
paddr = vtophys(xc, vaddr);
|
||||
dmaaddr = (char *)xc->physmem->dma_addr(paddr, ALPHA_PGBYTES);
|
||||
assert(dmaaddr);
|
||||
|
||||
char *term = (char *)memchr(dmaaddr, 0, ALPHA_PGBYTES);
|
||||
len = term ? (term - dmaaddr + 1) : ALPHA_PGBYTES;
|
||||
|
||||
memcpy(dst, dmaaddr, len);
|
||||
if (term)
|
||||
return;
|
||||
|
||||
maxlen -= ALPHA_PGBYTES;
|
||||
dst += ALPHA_PGBYTES;
|
||||
vaddr += ALPHA_PGBYTES;
|
||||
}
|
||||
|
||||
if (maxlen > 0) {
|
||||
paddr = vtophys(xc, vaddr);
|
||||
dmaaddr = (char *)xc->physmem->dma_addr(paddr, maxlen);
|
||||
assert(dmaaddr);
|
||||
|
||||
char *term = (char *)memchr(dmaaddr, 0, maxlen);
|
||||
len = term ? (term - dmaaddr + 1) : maxlen;
|
||||
|
||||
memcpy(dst, dmaaddr, len);
|
||||
|
||||
maxlen -= len;
|
||||
}
|
||||
|
||||
if (maxlen == 0)
|
||||
dst[maxlen] = '\0';
|
||||
}
|
||||
|
|
|
@ -42,5 +42,8 @@ Addr vtophys(PhysicalMemory *xc, Addr vaddr);
|
|||
Addr vtophys(ExecContext *xc, Addr vaddr);
|
||||
uint8_t *vtomem(ExecContext *xc, Addr vaddr, size_t len);
|
||||
|
||||
void CopyData(ExecContext *xc, void *dst, Addr vaddr, size_t len);
|
||||
void CopyString(ExecContext *xc, char *dst, Addr vaddr, size_t maxlen);
|
||||
|
||||
#endif // __VTOPHYS_H__
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
#ifdef FULL_SYSTEM
|
||||
#include "targetarch/arguments.hh"
|
||||
#include "targetarch/pmap.h"
|
||||
#include "targetarch/kernel.hh"
|
||||
#include "kern/tru64/kernel.hh"
|
||||
#include "mem/functional_mem/memory_control.hh"
|
||||
#include "cpu/full_cpu/cpu.hh"
|
||||
#include "sim/system.hh"
|
||||
|
|
Loading…
Reference in a new issue