qemu configuration [was: netdemo echoServer issue [was: Re: listen/select and then accept pattern not working?]]

Keith Robertson kjrobert at alumni.uwaterloo.ca
Mon Jan 17 17:45:38 UTC 2005


Joel Sherrill <joel at OARcorp.com> wrote:
> I would like to get your RTEMS network configuration for qemu. I haven't
> had a chance to play enough to get this working and am always willing
> to take a handout :)

Hi Joel,

Hopefully I'm not stepping on Karel's toes here.  I've spent sometime 
trying to figure out the minimum configuration that gets everything 
going on qemu.  I'm aiming to get a development environment with eclipse 
working so those who are not so big on the command line can have an 
environment that they like.  Some of this material has been gleaned from 
Lars Munch's post a while back: 
http://www.rtems.com/ml/rtems-users/2004/november/msg00307.html

To try and make this as useful as possible for those new to rtems and 
googling for answers, I've laid this out in a step-by-step format.

Here's the steps that worked for me:

1) configure/make/make install rtems for i386/pc386.  The following 
configure line was appropriate for me:
../rtems-4.6.2/configure --enable-posix --enable-networking 
--enable-rdbg --enable-cxx --enable-rtemsbsp="pc386" --target=i386-rtems 
--prefix=/opt/rtems-4.6

2) download qemu from: http://fabrice.bellard.free.fr/qemu/  I'm using 
version 0.6.1.  I downloaded and used the source as I wanted to ensure 
gdbstub was enabled.
2a) configure with:
$cd <qemu source dir>
$./configure --target-list="i386-softmmu" --prefix=/opt/qemu --gdbstub=yes
$make
$make install

Note that --gdbstub=yes is not mentioned in ./configure --help and 
doesn't show up in the list printed to stdout of enabled features.  To 
ensure it's on, look in config-host.mak in the qemu build directory.

3) Build the example programs.

4) Run the following commands to create a grub boot iso
$cd ~
$mkdir -p iso/boot/grub
$cp /usr/share/grub/stage2_eltorito iso/boot/grub
<copy all the example executables you want to run to ~/iso> For instance:
$cp ~/examples/hello/o-optimize/hello.exe ~/iso
$mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 
-boot-info-table -o grub.iso iso

5) Run qemu with your iso image -- note that no other configuration 
files are required.  This should do it for the basic test programs.
$/opt/qemu/bin/qemu -cdrom grub.iso

6) qemu boots grub at which point you type:
 > kernel (cd)/hello.exe
 > boot

That's the basic setup.

Now for networking:

7) Download the network-demos-4.6.2.tar.gz source package.

8) Edit network-demos-4.6.2/networkconfig.h:
a) Ensure that the defines RTEMS_BSP_NETWORK_DRIVER_NAME and 
RTEMS_BSP_NETWORK_DRIVER_ATTACH are "ne1" and rtems_ne_driver_attach 
respectively.  (Probably the best way to do this is from the 
$RTEMS_MAKEFILE_PATH/lib/include/bsp.h and set the defaults to be the 
ne2000 driver -- I suppose ideally one could create a new bsp that was 
almost the same as the pc386 but had the ne2000 driver as the default.)

b) ensure RTEMS_USE_BOOTP is defined -- qemu has a built in dhcp server.
c) ensure RTEMS_SET_ETHERNET_ADDRESS is not defined.
d) use the following rtems_bsdnet_ifconfig initialisation:

/*
  * Default network interface
  */
static struct rtems_bsdnet_ifconfig netdriver_config = {
     RTEMS_BSP_NETWORK_DRIVER_NAME,      /* name */
     RTEMS_BSP_NETWORK_DRIVER_ATTACH,    /* attach function */

#ifdef RTEMS_USE_LOOPBACK
     &loopback_config,       /* link to next interface */
#else
     NULL,               /* No more interfaces */
#endif

#if (defined (RTEMS_USE_BOOTP))
     NULL,               /* BOOTP supplies IP address */
     NULL,               /* BOOTP supplies IP net mask */
#else
     NULL,       /* IP address */
     NULL",      /* IP net mask */
#endif /* !RTEMS_USE_BOOTP */

#if (defined (RTEMS_SET_ETHERNET_ADDRESS))
     ethernet_address,               /* Ethernet hardware address */
#else
     NULL,                           /* Driver supplies hardware address */
#endif
     0,		/*ignore_broadcast*/
     0,		/*mtu */
     0,		/*rbuf_count*/
     0,		/*xbuf_count*/
     0x300,	/*port*/
     9,		/*irno*/
     0           /*bpar*/ 

};

Note that only the last 7 lines of this have changed from the defaults. 
  This is because the ne2000 driver defaults to looking for card at irq 
5.    If one were to create a qemu bsp, this is another thing I'd change.

9) Set DATA_SINK_HOST in test.c to a machine that accepts connections on 
the discard port.

10) compile netdemo.exe and copy it into your iso directory.

11) remake the iso image as described in 4.

12) run qemu:
$/opt/qemu/bin/qemu -cdrom grub.iso -user-net -isa -redir tcp:24742::24742

-user-net adds the user mode networking.  Note that ICMP requests won't 
work in user mode networking so you'll be unable to ping or be pinged. 
See Lars' post for info on how to setup tun/tap networking.
-redir allows another machine to telnet to the echo server.
- telnet <host machine -- the one running qemu> 24742 should be 
forwarded to the echo server running in rtems.
-isa removes pci simulation and allows the ne2000 card to be found (not 
sure why this is required yet).

13) grub should have booted and then run:

 > kernel (cd)/netdemo.exe
 > boot

14) You should get the standard output from netdemo.exe.  Specifically:

the guest ip address will be 10.0.2.15
the guest's gateway (qemu on your host) will be 10.0.2.2
the guest's dns server (qemu's dns relay) will be 10.0.2.3
subnet mask is set to 255.255.255.0
mac address is set to: 52:54:0:12:34:56

These are all the defaults from qemu's built-in dhcp server.  If you're 
lucky this doesn't clash with your network and you should be off to the 
races.  As this hasn't been a problem for me, I haven't had to go 
looking for how to convince qemu's dhcp server to use different 
defaults.  I presume it is possible.  If worst comes to worst, you can 
always specify these directly in networkconfig.h

Hope this is helpful.  Please correct any mistakes/typos.

Cheers,

Keith




More information about the users mailing list