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:
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user