From owner-freebsd-hackers@FreeBSD.ORG Fri Aug 20 08:53:23 2004 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id C4FFB16A4CE for ; Fri, 20 Aug 2004 08:53:23 +0000 (GMT) Received: from axe-inc.co.jp (axegw.axe-inc.co.jp [61.199.217.66]) by mx1.FreeBSD.org (Postfix) with ESMTP id DFF2D43D41 for ; Fri, 20 Aug 2004 08:53:22 +0000 (GMT) (envelope-from takawata@axe-inc.co.jp) Received: from localhost (localhost [127.0.0.1]) by axe-inc.co.jp (8.9.3+3.2W/3.7W) with SMTP id RAA05110; Fri, 20 Aug 2004 17:53:14 +0900 (JST) Message-Id: <200408200853.RAA05110@axe-inc.co.jp> X-Authentication-Warning: axegw.axe-inc.co.jp: localhost [127.0.0.1] didn't use HELO protocol To: Iasen Kostov From: takawata@jp.freebsd.org In-reply-to: Your message of "Fri, 20 Aug 2004 10:03:58 +0300." <4125A25E.4050602@OTEL.net> Date: Fri, 20 Aug 2004 17:53:14 +0900 Sender: takawata@axe-inc.co.jp cc: freebsd-hackers@freebsd.org Subject: Re: How can I fake a device ? X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 20 Aug 2004 08:53:23 -0000 In message <4125A25E.4050602@OTEL.net>, Iasen Kostov wrote: >>> Hi, >>>I want to know is there a way to call *_probe (for device driver) with >>>fake (PCI) device that does not exists in the system ? >>>First of all a cant find how "struct device" is declared (i've searched >>>even the compile/ dir) and second I think that I'll need to intercept >>>pci_get_vendor and pci_get_device funcs with my own which should detect >>>the fake device and thus will return vandor/device that I need to fake. >>>I realy don't need anything else except _probe ... >>> >>> >> >>I have never tried such but grimpsed the PCI framework, >>I propose the following, though I don't imagine why you want >>to do so: >> >>Your driver have to contain DEVICE_IDENTIFY method >>that calls device_add_child to allocate device_t object. >>Then you allocate 'struct pci_devinfo' and initialize >>pci_devinfo as you like. And you have to make your >>driver as a module. Then a device object will show up on >>the device tree on your system. >> >>You may want to have a look at pci_add_children@/sys/dev/pci/pci.c >> >> >> >I think I was not clear .. .sorry. I ment to lie the driver that some >device (that is not realy plugged in the machine) exists. Doing so I can >check if drivers _probe() func returns "OK" >or not and by checking every device from /usr/share/misc/pci_vendors I >could build device<->driver_file database. Hmm, do you want to implement docking station or something? This is a part of my interest. >I've patched a bit /sys/dev/pci/pci.c like this: > >typedef uintptr_t *pci_fake_read_ivars_t(pcicfgregs *cfg); >static pci_fake_read_ivars_t *pci_fake_read_ivars = NULL; > >int >pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) >{ > struct pci_devinfo *dinfo; > pcicfgregs *cfg = NULL; > > if(pci_fake_read_ivars && !strcmp("fake0", dev->nameunit)) { > (*pci_fake_read_ivars)(cfg); > } else { > dinfo = device_get_ivars(child); > cfg = &dinfo->cfg; > } > >And when I load my module it will set pci_fake_read_ivars and will start >to test drivers probe sending devices with nameunit set to "fake0" thus >telling pci_read_ivar() to fake the return values by calling >pci_fake_read_ivars() callback ... I think this is very messy ... I hope >that it will work this way :) pci_read_ivar itself will not access real hardware: cache its value and simply use hardware register index as ivar index. So it is enough to initialize struct pci_devinfo then call device_set_ivar. Rather, there may be problem when pci_cfg_save()@sys/dev/pci/pci.c is called.