/[gxemul]/trunk/doc/technical.html
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/doc/technical.html

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 41 by dpavlin, Mon Oct 8 16:21:17 2007 UTC revision 42 by dpavlin, Mon Oct 8 16:22:32 2007 UTC
# Line 10  Line 10 
10    
11  <!--  <!--
12    
13  $Id: technical.html,v 1.75 2006/12/30 13:30:51 debug Exp $  $Id: technical.html,v 1.76 2007/06/15 18:07:08 debug Exp $
14    
15  Copyright (C) 2004-2007  Anders Gavare.  All rights reserved.  Copyright (C) 2004-2007  Anders Gavare.  All rights reserved.
16    
# Line 107  with the emulator, e.g.: Line 107  with the emulator, e.g.:
107  <a name="net"></a>  <a name="net"></a>
108  <h3>Networking</h3>  <h3>Networking</h3>
109    
110  <font color="#ff0000">NOTE/TODO: This section is very old and a bit  <font color="#ff0000">NOTE/TODO: This section is very old.</font>
 out of date.</font>  
111    
112  <p>Running an entire operating system under emulation is very interesting  <p>Running an entire operating system under emulation is very interesting
113  in itself, but for several reasons, running a modern OS without access to  in itself, but for several reasons, running a modern OS without access to
# Line 310  fragmentation issue mentioned above. Line 309  fragmentation issue mentioned above.
309  <a name="devices"></a>  <a name="devices"></a>
310  <h3>Emulation of hardware devices</h3>  <h3>Emulation of hardware devices</h3>
311    
312  Each file called <tt>dev_*.c</tt> in the <tt>src/device/</tt> directory is  Each file called <tt>dev_*.c</tt> in the
313    <a href="../src/devices/"><tt>src/devices/</tt></a> directory is
314  responsible for one hardware device. These are used from  responsible for one hardware device. These are used from
315  <tt>src/machines/machine_*.c</tt>, when initializing which hardware a particular  <a href="../src/machines/"><tt>src/machines</tt></a><tt>/machine_*.c</tt>,
316  machine model will be using, or when adding devices to a machine using the  when initializing which hardware a particular machine model will be using,
317  <tt>device()</tt> command in configuration files.  or when adding devices to a machine using the <tt>device()</tt> command in
318    <a href="configfiles.html">configuration files</a>.
319    
320  <p>(I'll be using the name "<tt>foo</tt>" as the name of the device in all  <p>(I'll be using the name "<tt>foo</tt>" as the name of the device in all
321  these examples.  This is pseudo code, it might need some modification to  these examples.  This is pseudo code, it might need some modification to
# Line 329  actually compile and run.) Line 330  actually compile and run.)
330  <pre>  <pre>
331          DEVINIT(foo)          DEVINIT(foo)
332          {          {
333                  struct foo_data *d = malloc(sizeof(struct foo_data));                  struct foo_data *d;
334    
335                  if (d == NULL) {                  CHECK_ALLOCATION(d = malloc(sizeof(struct foo_data)));
                         fprintf(stderr, "out of memory\n");  
                         exit(1);  
                 }  
336                  memset(d, 0, sizeof(struct foo_data));                  memset(d, 0, sizeof(struct foo_data));
337    
338                  /*                  /*
339                   *  Set up stuff here, for example fill d with useful                   *  Set up stuff here, for example fill d with useful
340                   *  data. devinit contains settings like address, irq_nr,                   *  data. devinit contains settings like address, irq path,
341                   *  and other things.                   *  and other things.
342                   *                   *
343                   *  ...                   *  ...
344                   */                   */
345    
346                    INTERRUPT_CONNECT(devinit->interrupt_path, d->irq);
347                    
348                  memory_device_register(devinit->machine->memory, devinit->name,                  memory_device_register(devinit->machine->memory, devinit->name,
349                      devinit->addr, DEV_FOO_LENGTH,                      devinit->addr, DEV_FOO_LENGTH,
# Line 368  actually compile and run.) Line 368  actually compile and run.)
368          should be defined.          should be defined.
369  <pre>  <pre>
370          struct foo_data {          struct foo_data {
371                  int     irq_nr;                  struct interrupt        irq;
372                  /*  ...  */                  /*  ...  */
373          }          }
374  </pre><br>  </pre><br>
375          (There is an exception to this rule; ugly hacks which allow          (There is an exception to this rule; some legacy code and other
376          code in <tt>src/machine.c</tt> to use some structures makes it          ugly hacks have their device structs defined in
377          necessary to place the <tt>struct foo_data</tt> in          <tt>src/include/devices.h</tt> instead of <tt>dev_foo.c</tt>.
378          <tt>src/include/devices.h</tt> instead of in <tt>dev_foo.c</tt>          New code should not add stuff to <tt>devices.h</tt>.)
         itself. This is useful for example for interrupt controllers.)  
379    <p>    <p>
380    <li>If <tt>foo</tt> has a tick function (that is, something that needs to be    <li>If <tt>foo</tt> has a tick function (that is, something that needs to be
381          run at regular intervals) then <tt>FOO_TICKSHIFT</tt> and a tick          run at regular intervals) then <tt>FOO_TICKSHIFT</tt> and a tick
# Line 384  actually compile and run.) Line 383  actually compile and run.)
383  <pre>  <pre>
384          #define FOO_TICKSHIFT           14          #define FOO_TICKSHIFT           14
385    
386          void dev_foo_tick(struct cpu *cpu, void *extra)          DEVICE_TICK(foo)
387          {          {
388                  struct foo_data *d = (struct foo_data *) extra;                  struct foo_data *d = extra;
389    
390                  if (.....)                  if (.....)
391                          cpu_interrupt(cpu, d->irq_nr);                          INTERRUPT_ASSERT(d->irq);
392                  else                  else
393                          cpu_interrupt_ack(cpu, d->irq_nr);                          INTERRUPT_DEASSERT(d->irq);
394          }          }
395  </pre><br>  </pre><br>
396    
# Line 420  actually compile and run.) Line 419  actually compile and run.)
419                  struct foo_data *d = extra;                  struct foo_data *d = extra;
420                  uint64_t idata = 0, odata = 0;                  uint64_t idata = 0, odata = 0;
421    
422                  idata = memory_readmax64(cpu, data, len);                  if (writeflag == MEM_WRITE)
423                            idata = memory_readmax64(cpu, data, len);
424    
425                  switch (relative_addr) {                  switch (relative_addr) {
426                  /* .... */  
427                    /*  Handle accesses to individual addresses within
428                        the device here.  */
429    
430                    /*  ...  */
431    
432                  }                  }
433    
434                  if (writeflag == MEM_READ)                  if (writeflag == MEM_READ)

Legend:
Removed from v.41  
changed lines
  Added in v.42

  ViewVC Help
Powered by ViewVC 1.1.26