On Wed, 10 Apr 2019, Michael Schmitz wrote:

> On 10/04/19 12:58 PM, Finn Thain wrote:
> > On Wed, 10 Apr 2019, Michael Schmitz wrote:
> > 
> > > > A potentially good question is why kthread_probe_data() would return
> > > > NULL on 030:
> > > > ----------------------------
> > > > /**
> > > >   * kthread_probe_data - speculative version of kthread_data()
> > > >   * @task: possible kthread task in question
> > > >   *
> > > >   * @task could be a kthread task.  Return the data value specified when
> > > > it
> > > >   * was created if accessible.  If @task isn't a kthread task or its
> > > > data is
> > > >   * inaccessible for any reason, %NULL is returned.  This function
> > > > requires
> > > >   * that @task itself is safe to dereference.
> > > >   */
> > > > void *kthread_probe_data(struct task_struct *task)
> > > > {
> > > >          struct kthread *kthread = to_kthread(task);
> > > >          void *data = NULL;
> > > > 
> > > >          probe_kernel_read(&data, &kthread->data, sizeof(data));
> > > >          return data;
> > > > }
> > > > ----------------------------
> > > > 
> > > > My guess would be that it's inaccessible, and warnings Hatari was
> > > > giving on every syscall are somehow related to it.
> > > 
> > > Had kthread->data been inaccessible, probe_kernel_read() would have 
> > > taken a fault right there, wouldn't it?
> > > 
> > AFAICS, the pointer is not dereferenced until copy_from_user is 
> > called.
> 
> Yes, but that happens inside probe_kernel_read() here. But 
> kthread_probe_data() is not on the stack, only print_worker_info() is.
> 

Sorry but __probe_kernel_read is on the stack, as is 
__generic_copy_from_user:

...
Data read fault at 0x00000004 in Super Data (pc=0x2449e6)
...
PC: [<002449e6>] __generic_copy_from_user+0x1e/0x46
...
Call Trace: [<00068c16>] __probe_kernel_read+0x2a/0x50
...


> 
> > 
> > > The situation we encounter here (kthread->data == NULL)
> > If kthread == NULL then &kthread->data should be 0x00000008. But the log
> > says, "Data read fault at 0x00000004". That suggests kthread ==
> > 0xFFFFFFFC.
> 
> I don't think kthread is NULL here, but the data pointer in the kthread
> struct may be.
> 

Where does that pointer get de-referenced?

> > 
> > On Motorola '030, the register dumps seem to show the effect of the
> > postincrement on a0, that is, 0x00000008. But on Hatari, a0 equals the
> > fault address, that is 0x00000004. Weird.
> 
> Yes, you always have to factor in post-increment - by the time the fault is
> taken, the increment has already happened. Not that you _have_ to stick to
> that in an emulator though.
> 

That really depends what you want the emulator for. The NetBSD/mac68k 
53C80 SCSI driver utilizes the fault address, for example.

Even if you are right and such code never runs on Atari, this may be a bug 
in the UAE code, which could affect a bunch of other emulators, such as 
Previous.

-- 

> Cheers,
> 
>     Michael
> 
> 
> 

Reply via email to