}
int
-ClDriver::ioctl(ThreadContext *tc, unsigned req)
+ClDriver::ioctl(ThreadContext *tc, unsigned req, Addr buf_addr)
{
int index = 2;
auto process = tc->getProcessPtr();
- Addr buf_addr = process->getSyscallArg(tc, index);
switch (req) {
case HSA_GET_SIZES:
ClDriver(ClDriverParams *p);
void handshake(GpuDispatcher *_dispatcher);
int open(ThreadContext *tc, int mode, int flags);
- int ioctl(ThreadContext *tc, unsigned req);
+ int ioctl(ThreadContext *tc, unsigned req, Addr buf);
const char* codeOffToKernelName(uint64_t code_ptr);
private:
* @return The return code for the ioctl, or the negation of the errno
* (see the SyscallReturn class).
*/
- virtual int ioctl(ThreadContext *tc, unsigned req) = 0;
+ virtual int ioctl(ThreadContext *tc, unsigned req, Addr buf) = 0;
/**
* Virtual method, invoked when the user program calls mmap() on
template <class OS>
SyscallReturn
ioctlFunc(SyscallDesc *desc, int callnum, ThreadContext *tc,
- int tgt_fd, unsigned req, GuestABI::VarArgs<Addr> varargs)
+ int tgt_fd, unsigned req, Addr addr)
{
auto p = tc->getProcessPtr();
if (dfdp) {
EmulatedDriver *emul_driver = dfdp->getDriver();
if (emul_driver)
- return emul_driver->ioctl(tc, req);
+ return emul_driver->ioctl(tc, req, addr);
}
auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
switch (req) {
case SIOCGIFCONF: {
- Addr conf_addr = varargs.get<Addr>();
- BufferArg conf_arg(conf_addr, sizeof(ifconf));
+ BufferArg conf_arg(addr, sizeof(ifconf));
conf_arg.copyIn(tc->getVirtProxy());
ifconf *conf = (ifconf*)conf_arg.bufferPtr();
case SIOCGIFHWADDR:
#endif
case SIOCGIFMTU: {
- Addr req_addr = varargs.get<Addr>();
- BufferArg req_arg(req_addr, sizeof(ifreq));
+ BufferArg req_arg(addr, sizeof(ifreq));
req_arg.copyIn(tc->getVirtProxy());
status = ioctl(sfdp->getSimFD(), req, req_arg.bufferPtr());