sim,gpu: Make ioctl unconditionally take an address parameter.

The definition of ioctl is not actually variadic, it just doesn't
specify what the type of the pointer is that it takes as its third
argument. The man page says that that's because it predates void *
being valid C.

By passing this address around (even if it's unused), we avoid having
to extract system call arguments further down the call stack.

Change-Id: I62541237baafaec30bbe3df06b3284dd286a4051
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/23456
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Bobby R. Bruce <bbruce@ucdavis.edu>
Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
Gabe Black
2019-12-07 03:43:46 -08:00
parent b2625d0b03
commit 3b98e65eaf
4 changed files with 7 additions and 10 deletions

View File

@@ -103,11 +103,10 @@ ClDriver::open(ThreadContext *tc, int mode, int flags)
}
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:

View File

@@ -54,7 +54,7 @@ class ClDriver final : public EmulatedDriver
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:

View File

@@ -83,7 +83,7 @@ class EmulatedDriver : public SimObject
* @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

View File

@@ -702,7 +702,7 @@ copyOutStatfsBuf(PortProxy &mem, Addr addr,
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();
@@ -715,7 +715,7 @@ ioctlFunc(SyscallDesc *desc, int callnum, ThreadContext *tc,
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]);
@@ -724,8 +724,7 @@ ioctlFunc(SyscallDesc *desc, int callnum, ThreadContext *tc,
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();
@@ -754,8 +753,7 @@ ioctlFunc(SyscallDesc *desc, int callnum, ThreadContext *tc,
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());