source: rtems-libbsd/libbsd.txt @ c67debb

55-freebsd-126-freebsd-12freebsd-9.3
Last change on this file since c67debb was c67debb, checked in by Chris Johns <chrisj@…>, on 05/18/16 at 04:17:20

Add rc.conf documentation.

  • Property mode set to 100644
File size: 42.6 KB
Line 
1RTEMS BSD Library Guide
2=======================
3:toc:
4:icons:
5:numbered:
6:website: http://www.rtems.org/
7
8RTEMS uses FreeBSD 9.2 as the source of its TCP/IP and USB stacks.
9This is a guide which captures information on the
10process of merging code from FreeBSD, building this library,
11RTEMS specific support files, and general guidelines on what
12modifications to the FreeBSD source are permitted.
13
14Goals of this effort are
15
16* update TCP/IP and provide USB in RTEMS,
17* ease updating to future FreeBSD versions,
18* ease tracking changes in FreeBSD code,
19* minimize manual changes in FreeBSD code, and
20* define stable kernel/device driver API which is implemented
21by both RTEMS and FreeBSD. This is the foundation of the port.
22
23We will work to push our changes upstream to the FreeBSD Project
24and minimize changes required at each update point.
25
26*******************************************************************************
27This is a work in progress and is very likely to be incomplete.
28Please help by adding to it.
29*******************************************************************************
30
31== Getting Started
32
33=== Tool Chain ===
34
35You need a tool chain for RTEMS based on at least RSB 4.12 April 2016 or later.
36=== Installation Overview ===
37
38. You must configure your BSP with the +--disable-networking+ option to disable
39the old network stack.  Make sure no header files of the old network stack are
40installed.
41
42. Clone the Git repository +git clone git://git.rtems.org/rtems-libbsd.git+.
43. Change into the RTEMS BSD library root directory.
44. Edit the `config.inc` configuration file and adjust it to your environment.
45. Run +waf configure ...+.
46. Run +waf+.
47. Run +waf install+.
48
49Refer to the README.waf for Waf building instructions.
50
51Make sure the submodules have been initialised and are updated. If a 'git
52status' says `rtems_waf` need updating run the submodule update command:
53
54 $ git submodule rtems_waf update
55
56=== Board Support Package Requirements ===
57
58The RTEMS version must be at least 4.11.  The Board Support Package (BSP)
59should support the
60http://www.rtems.org/onlinedocs/doxygen/cpukit/html/group\__rtems\__interrupt__extension.html[Interrupt Manager Extension]
61// The first underscores have to be masked to stop asciidoc interpreting them
62to make use of generic FreeBSD based drivers.
63
64The linker command file of the BSP must contain the following section
65definitions:
66
67-------------------------------------------------------------------------------
68.rtemsroset : {
69        KEEP (*(SORT(.rtemsroset.*)))
70}
71
72.rtemsrwset : {
73        KEEP (*(SORT(.rtemsrwset.*)))
74}
75-------------------------------------------------------------------------------
76
77The first output section can be placed in read-only memory.  The second output
78section must be placed in read-write memory.  The output section name is not
79relevant.  The output sections may also contain other input sections.
80
81=== Board Support Package Configuration and Build ===
82
83You need to configure RTEMS for the desired BSP and install it.  The BSP should
84be configured with a disabled network stack.  The BSD library containing the
85new network stack is a separate package.  Using a BSP installation containing
86the old network stack may lead to confusion and unpredictable results.
87
88The following script is used to build the `arm/realview_pbx_a9_qemu` BSP for
89our internal testing purposes:
90
91-------------------------------------------------------------------------------
92#!/bin/sh
93
94cd ${HOME}/sandbox
95rm -rf b-realview_pbx_a9_qemu
96mkdir b-realview_pbx_a9_qemu
97cd b-realview_pbx_a9_qemu
98${HOME}/git-rtems/configure \
99        --prefix=${HOME}/sandbox/install \
100        --target=arm-rtems4.11 \
101        --enable-rtemsbsp=realview_pbx_a9_qemu \
102        --disable-networking && \
103        make && \
104        make install
105-------------------------------------------------------------------------------
106
107The `arm/realview_pbx_a9_qemu` BSP running on the Qemu simulator has some
108benefits for development and test of the BSD library
109
110* it offers a NULL pointer read and write protection,
111* Qemu is a fast simulator,
112* Qemu provides support for GDB watchpoints,
113* Qemu provides support for virtual Ethernet networks, e.g. TUN and bridge
114devices (you can run multiple test instances on one virtual network).
115
116=== BSD Library Configuration and Build ===
117
118The build system based on the Waf build system. To build with Waf please refer
119to the README.waf file.
120
121===== Example Configuration =====
122
123In the BSD library source directory edit the file `config.inc`.  Continuing on
124the above, the `config.inc` used to match the above is:
125
126-------------------------------------------------------------------------------
127# Mandatory: Select your BSP and installation prefix
128TARGET = arm-rtems4.11
129BSP = realview_pbx_a9_qemu
130PREFIX = $(HOME)/sandbox/install
131
132# Optional: Separate installation base directory
133INSTALL_BASE = $(PREFIX)/$(TARGET)/$(BSP)
134
135# Optional: Network test configuration
136TEST_RUNNER = $(BSP)
137NET_CFG_SELF_IP = 10.0.0.2
138NET_CFG_NETMASK = 255.255.0.0
139NET_CFG_PEER_IP = 10.0.0.1
140NET_CFG_GATEWAY_IP = 10.0.0.1
141NET_TAP_INTERFACE = tap0
142-------------------------------------------------------------------------------
143
144=== BSD Library Initialization ===
145
146To initialise the BSD Library create a suitable rc.conf file. The FreeBSD man
147page rc.conf(5) provides the details needed to create a suitable format file:
148
149 https://www.freebsd.org/cgi/man.cgi?rc.conf
150
151You can call one of three functions to run the initialisation once BSD has
152initialised:
153
154 - rtems_bsd_run_etc_rc_conf: Run /etc/rc.conf.
155 - rtems_bsd_run_rc_conf: Run a user supplied file.
156 - rtems_bsd_run_rc_conf_script: Run the in memory line feed separated text string.
157
158For exapmle:
159
160 void
161 network_init(void)
162 {
163   rtems_status_code sc;
164
165   sc = rtems_bsd_initialize();
166   assert(sc == RTEMS_SUCCESSFUL);
167
168   rtems_bsd_run_etc_rc_conf(true); /* verbose = true */
169
170}
171
172By default the networking support is builtin. Other directives can be added and
173are found in 'machine/rtems-bsd-rc-conf-directives.h'. Please check the file
174for the list.
175
176The following network names are supported:
177
178  cloned_interfaces
179  ifconfig_'interface'
180  defaultrouter
181  hostname
182
183For example:
184
185 #
186 # My BSD initialisation.
187 #
188 hostname="myhost"
189 cloned_interfaces="vlan0 vlan1"
190 ifconfig_re0="inet inet 10.10.10.10 netmask 255.255.255.0"
191 fconfig_vlan0="inet 10.11.10.10 255.255.255.0 vlan 101 vlandev re0"
192 defaultrouter="10.10.10.1"
193
194You can also intialise the BSD library using code. The following code to
195initialize the BSD library:
196
197-------------------------------------------------------------------------------
198#include <assert.h>
199#include <sysexits.h>
200
201#include <machine/rtems-bsd-commands.h>
202#include <rtems/bsd/bsd.h>
203
204static void
205network_ifconfig_lo0(void)
206{
207        int exit_code;
208        char *lo0[] = {
209                "ifconfig",
210                "lo0",
211                "inet",
212                "127.0.0.1",
213                "netmask",
214                "255.255.255.0",
215                NULL
216        };
217        char *lo0_inet6[] = {
218                "ifconfig",
219                "lo0",
220                "inet6",
221                "::1",
222                "prefixlen",
223                "128",
224                NULL
225        };
226
227        exit_code = rtems_bsd_command_ifconfig(RTEMS_BSD_ARGC(lo0), lo0);
228        assert(exit_code == EX_OK);
229
230        exit_code = rtems_bsd_command_ifconfig(RTEMS_BSD_ARGC(lo0_inet6), lo0_inet6);
231        assert(exit_code == EX_OK);
232}
233
234void
235network_init(void)
236{
237        rtems_status_code sc;
238
239        sc = rtems_bsd_initialize();
240        assert(sc == RTEMS_SUCCESSFUL);
241
242        network_ifconfig_lo0();
243}
244-------------------------------------------------------------------------------
245
246This performs the basic network stack initialization with a loopback interface.
247Further initialization must be done using the standard BSD network
248configuration commands
249http://www.freebsd.org/cgi/man.cgi?query=ifconfig&apropos=0&sektion=8&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[IFCONFIG(8)]
250using `rtems_bsd_command_ifconfig()` and
251http://www.freebsd.org/cgi/man.cgi?query=route&apropos=0&sektion=8&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[ROUTE(8)]
252using `rtems_bsd_command_route()`.  For an example please have a look at
253`testsuite/include/rtems/bsd/test/default-network-init.h`.
254
255=== Task Priorities and Stack Size ===
256
257The default task priority is 96 for the interrupt server task (name "IRQS"), 98
258for the timer server task (name "TIME") and 100 for all other tasks.  The
259application may provide their own implementation of the
260`rtems_bsd_get_task_priority()` function (for example in the module which calls
261`rtems_bsd_initialize()`) if different values are desired.
262
263The task stack size is determined by the `rtems_bsd_get_task_stack_size()`
264function which may be provided by the application in case the default is not
265appropriate.
266
267=== Size for Allocator Domains ===
268
269The size for an allocator domain can be specified via the
270`rtems_bsd_get_allocator_domain_size()` function.  The application may provide
271their own implementation of the `rtems_bsd_get_allocator_domain_size()`
272function (for example in the module which calls `rtems_bsd_initialize()`) if
273different values are desired.  The default size is 8MiB for all domains.
274
275== Network Stack Features
276
277http://roy.marples.name/projects/dhcpcd/index[DHCPCD(8)]:: DHCP client
278
279https://developer.apple.com/library/mac/documentation/Networking/Reference/DNSServiceDiscovery_CRef/Reference/reference.html[dns_sd.h]:: DNS Service Discovery
280
281http://www.opensource.apple.com/source/mDNSResponder/mDNSResponder-320.10/mDNSCore/mDNSEmbeddedAPI.h[mDNS]:: Multi-Cast DNS
282
283http://www.freebsd.org/cgi/man.cgi?query=unix&sektion=4&apropos=0&manpath=FreeBSD+9.2-RELEASE[UNIX(4)]:: UNIX-domain protocol family
284
285http://www.freebsd.org/cgi/man.cgi?query=inet&sektion=4&apropos=0&manpath=FreeBSD+9.2-RELEASE[INET(4)]:: Internet protocol family
286
287http://www.freebsd.org/cgi/man.cgi?query=inet6&apropos=0&sektion=4&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[INET6(4)]:: Internet protocol version 6 family
288
289http://www.freebsd.org/cgi/man.cgi?query=tcp&apropos=0&sektion=4&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[TCP(4)]:: Internet Transmission Control Protocol
290
291http://www.freebsd.org/cgi/man.cgi?query=udp&apropos=0&sektion=4&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[UDP(4)]:: Internet User Datagram Protocol
292
293http://www.freebsd.org/cgi/man.cgi?query=route&sektion=4&apropos=0&manpath=FreeBSD+9.2-RELEASE[ROUTE(4)]:: Kernel packet forwarding database
294
295http://www.freebsd.org/cgi/man.cgi?query=bpf&apropos=0&sektion=4&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[BPF(4)]:: Berkeley Packet Filter
296
297http://www.freebsd.org/cgi/man.cgi?query=socket&apropos=0&sektion=2&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[SOCKET(2)]:: Create an endpoint for communication
298
299http://www.freebsd.org/cgi/man.cgi?query=kqueue&apropos=0&sektion=2&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[KQUEUE(2)]:: Kernel event notification mechanism
300
301http://www.freebsd.org/cgi/man.cgi?query=select&apropos=0&sektion=2&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[SELECT(2)]:: Synchronous I/O multiplexing
302
303http://www.freebsd.org/cgi/man.cgi?query=poll&apropos=0&sektion=2&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[POLL(2)]:: Synchronous I/O multiplexing
304
305http://www.freebsd.org/cgi/man.cgi?query=route&apropos=0&sektion=8&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[ROUTE(8)]:: Manually manipulate the routing tables
306
307http://www.freebsd.org/cgi/man.cgi?query=ifconfig&apropos=0&sektion=8&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[IFCONFIG(8)]:: Configure network interface parameters
308
309http://www.freebsd.org/cgi/man.cgi?query=netstat&apropos=0&sektion=1&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[NETSTAT(1)]:: Show network status
310
311http://www.freebsd.org/cgi/man.cgi?query=ping&apropos=0&sektion=8&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[PING(8)]:: Send ICMP ECHO_REQUEST packets to network hosts
312
313http://www.freebsd.org/cgi/man.cgi?query=ping6&apropos=0&sektion=8&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[PING6(8)]:: Send ICMPv6 ECHO_REQUEST packets to network hosts
314
315http://www.freebsd.org/cgi/man.cgi?query=sysctl&sektion=3&apropos=0&manpath=FreeBSD+9.2-RELEASE[SYSCTL(3)]:: Get or set system information
316
317http://www.freebsd.org/cgi/man.cgi?query=resolver&sektion=3&apropos=0&manpath=FreeBSD+9.2-RELEASE[RESOLVER(3)]:: Resolver routines
318
319http://www.freebsd.org/cgi/man.cgi?query=gethostbyname&sektion=3&apropos=0&manpath=FreeBSD+9.2-RELEASE[GETHOSTBYNAME(3)]:: Get network host entry
320
321== Network Interface Drivers
322
323=== Link Up/Down Events
324
325You can notifiy the application space of link up/down events in your network
326interface driver via the if_link_state_change(LINK_STATE_UP/LINK_STATE_DOWN)
327function.  The DHCPCD(8) client is a consumer of these events for example.
328Make sure that the interface flag IFF_UP and the interface driver flag
329IFF_DRV_RUNNING is set in case the link is up, otherwise ether_output() will
330return the error status ENETDOWN.
331
332== Shell Commands
333
334=== HOSTNAME(1)
335
336In addition to the standard options the RTEMS version of the HOSTNAME(1)
337command supports the -m flag to set/get the multicast hostname of the
338mDNS resolver instance.  See also rtems_mdns_sethostname() and
339rtems_mdns_gethostname().
340
341== Qemu
342
343Use the following script to set up a virtual network with three tap devices
344connected via one bridge device.
345
346-------------------------------------------------------------------------------
347#!/bin/sh -x
348
349user=`whoami`
350interfaces=(1 2 3)
351
352tap=qtap
353bri=qbri
354
355case $1 in
356        up)
357                sudo -i brctl addbr $bri
358                for i in ${interfaces[@]} ; do
359                        sudo -i tunctl -t $tap$i -u $user ;
360                        sudo -i ifconfig $tap$i up ;
361                        sudo -i brctl addif $bri $tap$i ;
362                done
363                sudo -i ifconfig $bri up
364                ;;
365        down)
366                for i in ${interfaces[@]} ; do
367                        sudo -i ifconfig $tap$i down ;
368                        sudo -i tunctl -d $tap$i ;
369                done
370                sudo -i ifconfig $bri down
371                sudo -i brctl delbr $bri
372                ;;
373esac
374-------------------------------------------------------------------------------
375
376Connect your Qemu instance to one of the tap devices, e.g.
377
378-------------------------------------------------------------------------------
379qemu-system-i386 -m 512 -boot a -cpu pentium3 \
380        -drive file=$HOME/qemu/pc386_fda,index=0,if=floppy,format=raw \
381        -drive file=fat:$HOME/qemu/hd,format=raw \
382        -net nic,model=e1000,macaddr=0e:b0:ba:5e:ba:11 \
383        -net tap,ifname=qtap1,script=no,downscript=no \
384        -nodefaults -nographic -serial stdio
385-------------------------------------------------------------------------------
386
387Make sure that each Qemu instance uses its own MAC address to avoid an address
388conflict (or otherwise use it as a test).
389
390To connect the Qemu instances with your local network use the following
391(replace 'eth0' with the network interface of your host).
392
393-------------------------------------------------------------------------------
394ifconfig eth0 0.0.0.0
395brctl addif qbri eth0
396dhclient qbri
397-------------------------------------------------------------------------------
398
399== Issues and TODO
400
401* PCI support on x86 uses a quick and dirty hack, see pci_reserve_map().
402
403* Priority queues are broken with clustered scheduling.
404
405* Per-CPU data should be enabled once the new stack is ready for SMP.
406
407* Per-CPU NETISR(9) should be enabled onece the new stack is ready for SMP.
408
409* Multiple routing tables are not supported.  Every FIB value is set to zero
410  (= BSD_DEFAULT_FIB).
411
412* Process identifiers are not supported.  Every PID value is set to zero
413  (= BSD_DEFAULT_PID).
414
415* User credentials are not supported.  The following functions allow the
416  operation for everyone
417  - prison_equal_ip4(),
418  - chgsbsize(),
419  - cr_cansee(),
420  - cr_canseesocket() and
421  - cr_canseeinpcb().
422
423* A basic USB functionality test that is known to work on Qemu is desirable.
424
425* Adapt generic IRQ PIC interface code to Simple Vectored Interrupt Model
426  so that those architectures can use new TCP/IP and USB code.
427
428* freebsd-userspace/rtems/include/sys/syslog.h is a copy from the old
429  RTEMS TCP/IP stack. For some reason, the __printflike markers do not
430  compile in this environment. We may want to use the FreeBSD syslog.h
431  and get this addressed.
432
433* in_cksum implementations for architectures not supported by FreeBSD.
434  This will require figuring out where to put implementations that do
435  not originate from FreeBSD and are populated via the script.
436
437* MAC support functions are not thread-safe ("freebsd/lib/libc/posix1e/mac.c").
438
439* IFCONFIG(8): IEEE80211 support is disabled.  This module depends on a XML
440  parser and mmap().
441
442* get_cyclecount(): The implementation is a security problem.
443
444* What to do with the priority parameter present in the FreeBSD synchronization
445  primitives and the thread creation functions?
446
447* TASKQUEUE(9): Support spin mutexes.
448
449* ZONE(9): Review allocator lock usage in rtems-bsd-chunk.c.
450
451* KQUEUE(2): Choose proper lock for global kqueue list.
452
453* TIMEOUT(9): Maybe use special task instead of timer server to call
454  callout_tick().
455
456* sysctl_handle_opaque(): Implement reliable snapshots.
457
458* PING6(8): What to do with SIGALARM?
459
460* <sys/param.h>: Update Newlib to use a MSIZE of 256.
461
462* BPF(4): Add support for zero-copy buffers.
463
464* UNIX(4): Fix race conditions in the area of socket object and file node
465  destruction.  Add support for file descriptor transmission via control
466  messages.
467
468* PRINTF(9): Add support for log(), the %D format specifier is missing in the
469  normal printf() family.
470
471* Why is the interrupt server used?  The BSD interrupt handlers can block on
472synchronization primitives like mutexes.  This is in contrast to RTEMS
473interrupt service routines.  The BSPs using the generic interrupt support must
474implement the `bsp_interrupt_vector_enable()` and
475`bsp_interrupt_vector_disable()` routines.  They normally enable/disable a
476particular interrupt source at the interrupt controller.  This can be used to
477implement the interrupt server.  The interrupt server is a task that wakes-up
478in case an associated interrupt happens.  The interrupt source is disabled in
479a generic interrupt handler that wakes-up the interrupt server task.   Once the
480postponed interrupt processing is performed in the interrupt server the
481interrupt source is enabled again.
482
483* Convert all BSP linkcmds to use a linkcmds.base so the sections are
484easier to insert.
485
486* NIC Device Drivers
487- Only common PCI NIC drivers have been included in the initial set. These
488do not include any system on chip or ISA drivers.
489- PCI configuration probe does not appear to happen to determine if a
490NIC is in I/O or memory space. We have worked around this by using a
491static hint to tell the fxp driver the correct mode. But this needs to
492be addressed.
493- The ISA drivers require more BSD infrastructure to be addressed. This was
494outside the scope of the initial porting effort.
495
496== FreeBSD Source
497
498You should be able to rely on FreebSD manual pages and documentation
499for details on the code itself.
500
501=== Automatically Generated FreeBSD Files
502
503Some source and header files are automatically generated during the FreeBSD
504build process.  The `Makefile.todo` file performs this manually.  The should be
505included in `freebsd-to-rtems.py` script some time in the future.  For details,
506see also
507http://www.freebsd.org/cgi/man.cgi?query=kobj&sektion=9&apropos=0&manpath=FreeBSD+9.2-RELEASE[KOBJ(9)].
508
509=== Rules for Modifying FreeBSD Source
510
511Only add lines.  If your patch contains lines starting with a '-', then this is
512wrong.  Subtract code by added `#ifndef __rtems__`.  This makes merging easier
513in the future.  For example:
514
515-------------------------------------------------------------------------------
516/* Global variables for the kernel. */
517
518#ifndef __rtems__
519/* 1.1 */
520extern char kernelname[MAXPATHLEN];
521#endif /* __rtems__ */
522
523extern int tick;                        /* usec per tick (1000000 / hz) */
524-------------------------------------------------------------------------------
525
526-------------------------------------------------------------------------------
527#if defined(_KERNEL) || defined(_WANT_FILE)
528#ifdef __rtems__
529#include <rtems/libio_.h>
530#include <sys/fcntl.h>
531#endif /* __rtems__ */
532/*
533 * Kernel descriptor table.
534 * One entry for each open kernel vnode and socket.
535 *
536 * Below is the list of locks that protects members in struct file.
537 *
538 * (f) protected with mtx_lock(mtx_pool_find(fp))
539 * (d) cdevpriv_mtx
540 * none not locked
541 */
542-------------------------------------------------------------------------------
543
544-------------------------------------------------------------------------------
545extern int profprocs;                   /* number of process's profiling */
546#ifndef __rtems__
547extern volatile int ticks;
548#else /* __rtems__ */
549#include <rtems/score/watchdogimpl.h>
550#define ticks _Watchdog_Ticks_since_boot
551#endif /* __rtems__ */
552
553#endif /* _KERNEL */
554-------------------------------------------------------------------------------
555
556Add nothing (even blank lines) before or after the `__rtems__` guards.  Always
557include a `__rtems__` in the guards to make searches easy, so use
558
559* `#ifndef __rtems__`,
560* `#ifdef __rtems__`,
561* `#else /* __rtems__ */`, and
562* `#endif /* __rtems__ */`.
563
564For new code use
565http://www.freebsd.org/cgi/man.cgi?query=style&apropos=0&sektion=9&manpath=FreeBSD+9.2-RELEASE&arch=default&format=html[STYLE(9)].
566Do not format original FreeBSD code.
567
568== BSD Library Source
569
570=== What is in the Git Repository
571
572There is a self-contained kit with FreeBSD and RTEMS components pre-merged. The
573Waf wscript in this kit is automatically generated.
574
575Any changes to source in the `freebsd` directories will need to be merged
576upstream into our master FreeBSD checkout, the `freebsd-org` submodule.
577
578The repository contains two FreeBSD source trees.  In the `freebsd` directory
579are the so called 'managed' FreeBSD sources used to build the BSD library.  The
580FreeBSD source in `freebsd-org` is the 'master' version.  The
581`freebsd-to-rtems.py` script is used to transfer files between the two trees.
582In general terms, if you have modified managed FreeBSD sources, you will need
583to run the script in 'revert' or 'reverse' mode using the `-R` switch.  This
584will copy the source back to your local copy of the master FreeBSD source so
585you can run `git diff` against the upstream FreeBSD source.  If you want to
586transfer source files from the master FreeBSD source to the manged FreeBSD
587sources, then you must run the script in 'forward' mode (the default).
588
589=== Organization
590
591The top level directory contains a few directories and files. The following
592are important to understand
593
594* `freebsd-to-rtems.py` - script to convert to and free FreeBSD and RTEMS trees,
595* `create-kernel-namespace.sh` - script to create the kernel namespace header <machine/rtems-bsd-kernel-namespace.h,
596* `wscript` - automatically generated,
597* `freebsd/` - from FreeBSD by script,
598* `rtemsbsd/` - RTEMS specific implementations of FreeBSD kernel support routines,
599* `testsuite/` - RTEMS specific tests, and
600* `libbsd.txt` - documentation in Asciidoc.
601
602== Moving Code Between Managed and Master FreeBSD Source
603
604The script `freebsd-to-rtems.py` is used to copy code from FreeBSD to the
605rtems-libbsd tree and to reverse this process. This script attempts to
606automate this process as much as possible and performs some transformations
607on the FreeBSD code. Its command line arguments are shown below:
608
609----
610freebsd-to-rtems.py [args]
611  -?|-h|--help      print this and exit
612  -d|--dry-run      run program but no modifications
613  -D|--diff         provide diff of files between trees
614  -e|--early-exit   evaluate arguments, print results, and exit
615  -m|--makefile     Warning: depreciated and will be removed
616  -b|--buildscripts just generate the build scripts
617  -R|--reverse      default FreeBSD -> RTEMS, reverse that
618  -r|--rtems        RTEMS directory
619  -f|--freebsd      FreeBSD directory
620  -v|--verbose      enable verbose output mode
621----
622
623In its default mode of operation, freebsd-to-rtems.py is used to copy code
624from FreeBSD to the rtems-libbsd tree and perform transformations.  In forward
625mode, the script may be requested to just generate the Waf script.
626
627In "reverse mode", this script undoes those transformations and copies
628the source code back to the FreeBSD SVN tree. This allows us to do
629'svn diff', evaluate changes made by the RTEMS Project, and report changes
630back to FreeBSD upstream.
631
632In either mode, the script may be asked to perform a dry-run or be verbose.
633Also, in either mode, the script is also smart enough to avoid copying over
634files which have not changed. This means that the timestamps of files are
635not changed unless the contents change. The script will also report the
636number of files which changed. In verbose mode, the script will print
637the name of the files which are changed.
638
639To add or update files int the RTEMS FreeBSD tree first run the 'reverse mode'
640and move the current set of patches FreeBSD. The script may warn you if a file
641is not present at the destination for the direction. This can happen as files
642not avaliable at the FreeBSD snapshot point have been specially added to the
643RTEMS FreeBSD tree. Warnings can also appear if you have changed the list of
644files in libbsd.py. The reverse mode will result in the FreeBSD having
645uncommitted changes. You can ignore these. Once the reverse process has
646finished edit libbsd.py and add any new files then run the forwad mode to bring
647those files into the RTEMS FreeBSD tree.
648
649The following is an example forward run with no changes.
650
651----
652$ ~/newbsd/git/libbsd-8.2/freebsd-to-rtems.py \
653    -r /home/joel/newbsd/git/libbsd-8.2 \
654    -f /home/joel/newbsd/libbsd/freebsd-8.2 -v
655Verbose:                yes (1)
656Dry Run:                no
657Only Generate Makefile: no
658RTEMS Directory:        /home/joel/newbsd/git/libbsd-8.2
659FreeBSD Directory:      /home/joel/newbsd/libbsd/freebsd-8.2
660Direction:              forward
661Generating into /home/joel/newbsd/git/libbsd-8.2
6620 files were changed.
663----
664
665The script may also be used to generate a diff in either forward or reverse
666direction.
667
668You can add more than one verbose option (-v) to the command line and get more
669detail and debug level information from the command.
670
671== How to import code from FreeBSD
672
673. Run `git status` and make sure your working directory is clean.
674. Run `./freebsd-to-rtems.py -R`
675. Run `./freebsd-to-rtems.py`
676. Run `git status` and make sure your working directory is clean.  If you see modified files, then the `freebsd-to-rtems.py` script needs to be fixed first.
677. Add the files to import to `libbsd.py`.
678. Run `./freebsd-to-rtems.py`
679. Immediately check in the imported files without the changes to `libbsd_waf.py`.  Do not touch the imported files yourself at this point.
680. Port the imported files to RTEMS.  See 'Rules for Modifying FreeBSD Source'.
681. Add a test to the testsuite if possible.
682. Run `./create-kernel-namespace.sh` if you imported kernel space headers.  Add only your new defines via `git add -p rtemsbsd/include/machine/rtems-bsd-kernel-namespace.h`.
683. Create one commit from this.
684
685== Initialization of the BSD Library
686
687The initialization of the BSD library is based on the FreeBSD SYSINIT(9)
688infrastructure.  The key to initializing a system is to ensure that the desired
689device drivers are explicitly pulled into the linked application.  This plus
690linking against the BSD library (`libbsd.a`) will pull in the necessary FreeBSD
691infrastructure.
692
693The FreeBSD kernel is not a library like the RTEMS kernel.  It is a bunch of
694object files linked together.  If we have a library, then creating the
695executable is simple.  We begin with a start symbol and recursively resolve all
696references.  With a bunch of object files linked together we need a different
697mechanism.  Most object files don't know each other.  Lets say we have a driver
698module.  The rest of the system has no references to this driver module.  The
699driver module needs a way to tell the rest of the system: Hey, kernel I am
700here, please use my services!
701
702This registration of independent components is performed by SYSINIT(9) and
703specializations:
704
705http://www.freebsd.org/cgi/man.cgi?query=SYSINIT
706
707The SYSINIT(9) uses some global data structures that are placed in a certain
708section.  In the linker command file we need this:
709
710-------------------------------------------------------------------------------
711.rtemsroset : {
712        KEEP (*(SORT(.rtemsroset.*)))
713}
714
715.rtemsrwset : {
716        KEEP (*(SORT(.rtemsrwset.*)))
717}
718-------------------------------------------------------------------------------
719
720This results for example in this executable layout:
721
722-------------------------------------------------------------------------------
723[...]
724 *(SORT(.rtemsroset.*))
725 .rtemsroset.bsd.modmetadata_set.begin
726                0x000000000025fe00        0x0 libbsd.a(rtems-bsd-init.o)
727                0x000000000025fe00                _bsd__start_set_modmetadata_set
728 .rtemsroset.bsd.modmetadata_set.content
729                0x000000000025fe00        0x8 libbsd.a(rtems-bsd-nexus.o)
730 .rtemsroset.bsd.modmetadata_set.content
731                0x000000000025fe08        0x4 libbsd.a(kern_module.o)
732[...]
733 .rtemsroset.bsd.modmetadata_set.content
734                0x000000000025fe68        0x4 libbsd.a(mii.o)
735 .rtemsroset.bsd.modmetadata_set.content
736                0x000000000025fe6c        0x4 libbsd.a(mii_bitbang.o)
737 .rtemsroset.bsd.modmetadata_set.end
738                0x000000000025fe70        0x0 libbsd.a(rtems-bsd-init.o)
739                0x000000000025fe70                _bsd__stop_set_modmetadata_set
740[...]
741.rtemsrwset     0x000000000030bad0      0x290
742 *(SORT(.rtemsrwset.*))
743 .rtemsrwset.bsd.sysinit_set.begin
744                0x000000000030bad0        0x0 libbsd.a(rtems-bsd-init.o)
745                0x000000000030bad0                _bsd__start_set_sysinit_set
746 .rtemsrwset.bsd.sysinit_set.content
747                0x000000000030bad0        0x4 libbsd.a(rtems-bsd-nexus.o)
748 .rtemsrwset.bsd.sysinit_set.content
749                0x000000000030bad4        0x8 libbsd.a(rtems-bsd-thread.o)
750 .rtemsrwset.bsd.sysinit_set.content
751                0x000000000030badc        0x4 libbsd.a(init_main.o)
752[...]
753 .rtemsrwset.bsd.sysinit_set.content
754                0x000000000030bd54        0x4 libbsd.a(frag6.o)
755 .rtemsrwset.bsd.sysinit_set.content
756                0x000000000030bd58        0x8 libbsd.a(uipc_accf.o)
757 .rtemsrwset.bsd.sysinit_set.end
758                0x000000000030bd60        0x0 libbsd.a(rtems-bsd-init.o)
759                0x000000000030bd60                _bsd__stop_set_sysinit_set
760[...]
761-------------------------------------------------------------------------------
762
763Here you can see, that some global data structures are collected into
764continuous memory areas.  This memory area can be identified by start and stop
765symbols.  This constructs a table of uniform items.
766
767The low level FreeBSD code calls at some time during the initialization the
768mi_startup() function (machine independent startup).  This function will sort
769the SYSINIT(9) set and call handler functions which perform further
770initialization.  The last step is the scheduler invocation.
771
772The SYSINIT(9) routines are run in mi_startup() which is called by
773rtems_bsd_initialize().
774
775This is also explained in "The Design and Implementation of the FreeBSD
776Operating System" section 14.3 "Kernel Initialization".
777
778In RTEMS we have a library and not a bunch of object files.  Thus we need a way
779to pull-in the desired services out of the libbsd.  Here the
780`rtems-bsd-sysinit.h` comes into play.  The SYSINIT(9) macros have been
781modified and extended for RTEMS in `<sys/kernel.h>`:
782
783-------------------------------------------------------------------------------
784#ifndef __rtems__
785#define C_SYSINIT(uniquifier, subsystem, order, func, ident)    \
786        static struct sysinit uniquifier ## _sys_init = {       \
787                subsystem,                                      \
788                order,                                          \
789                func,                                           \
790                (ident)                                         \
791        };                                                      \
792        DATA_SET(sysinit_set,uniquifier ## _sys_init)
793#else /* __rtems__ */
794#define SYSINIT_ENTRY_NAME(uniquifier)                          \
795        _bsd_ ## uniquifier ## _sys_init
796#define SYSINIT_REFERENCE_NAME(uniquifier)                      \
797        _bsd_ ## uniquifier ## _sys_init_ref
798#define C_SYSINIT(uniquifier, subsystem, order, func, ident)    \
799        struct sysinit SYSINIT_ENTRY_NAME(uniquifier) = {       \
800                subsystem,                                      \
801                order,                                          \
802                func,                                           \
803                (ident)                                         \
804        };                                                      \
805        RWDATA_SET(sysinit_set,SYSINIT_ENTRY_NAME(uniquifier))
806#define SYSINIT_REFERENCE(uniquifier)                           \
807        extern struct sysinit SYSINIT_ENTRY_NAME(uniquifier);   \
808        static struct sysinit const * const                     \
809        SYSINIT_REFERENCE_NAME(uniquifier) __used               \
810        = &SYSINIT_ENTRY_NAME(uniquifier)
811#define SYSINIT_MODULE_REFERENCE(mod)                           \
812        SYSINIT_REFERENCE(mod ## module)
813#define SYSINIT_DRIVER_REFERENCE(driver, bus)                   \
814        SYSINIT_MODULE_REFERENCE(driver ## _ ## bus)
815#define SYSINIT_DOMAIN_REFERENCE(dom)                           \
816        SYSINIT_REFERENCE(domain_add_ ## dom)
817#endif /* __rtems__ */
818-------------------------------------------------------------------------------
819
820Here you see that the SYSINIT(9) entries are no longer static.  The
821\*_REFERENCE() macros will create references to the corresponding modules which
822are later resolved by the linker.  The application has to provide an object
823file with references to all required FreeBSD modules.
824
825The FreeBSD device model is quite elaborated (with follow-ups):
826
827http://www.freebsd.org/cgi/man.cgi?query=driver
828
829The devices form a tree with the Nexus device at a high-level.  This Nexus
830device is architecture specific in FreeBSD.  In RTEMS we have our own Nexus
831device, see `rtemsbsd/bsp/bsp-bsd-nexus-devices.c`.
832
833=== SYSCTL_NODE Example
834
835During development, we had an undefined reference to
836_bsd_sysctl__net_children that we had trouble tracking down. Thanks to
837Chris Johns, we located it. He explained how to read SYSCTL_NODE
838definitions. This line from freebsd/netinet/in_proto.c is attempting
839to add the "inet" node to the parent node "_net".
840
841----
842SYSCTL_NODE(_net,      PF_INET,         inet,   CTLFLAG_RW, 0,
843        "Internet Family");
844----
845
846Our problem was that we could not find where _bsd_sysctl__net_children
847was defined. Chris suggested that when in doubt compile with -save-temps
848and look at the preprocessed .i files. But he did not need that. He
849explained that this the symbol name _bsd_sysctl__net_children was
850automatically generated by a SYSCTL_NODE as follows:
851
852* _bsd_ - added by RTEMS modifications to SYSCTL_NODE macro
853* sysctl_ - boilerplace added by SYSCTL_NODE macro
854* "" - empty string for parent node
855* net - name of SYSCTL_NODE
856* children - added by SYSCTL macros
857
858This was all generated by a support macro declaring the node as this:
859
860----
861struct sysctl_oid_list SYSCTL_NODE_CHILDREN(parent, name);
862----
863
864Given this information, we located this SYSCTL_NODE declaration in
865kern/kern_mib.c
866
867----
868SYSCTL_NODE(, CTL_KERN,   kern,   CTLFLAG_RW, 0,
869        "High kernel, proc, limits &c");
870----
871
872== Core FreeBSD APIs and RTEMS Replacements ==
873
874=== SX(9) (Shared/exclusive locks) ===
875
876http://www.freebsd.org/cgi/man.cgi?query=sx
877
878Binary semaphores (this neglects the ability to allow shared access).
879
880=== MUTEX(9) (Mutual exclusion) ===
881
882http://www.freebsd.org/cgi/man.cgi?query=mutex
883
884Binary semaphores (not recursive mutexes are not supported this way).
885
886=== RWLOCK(9) (Reader/writer lock) ===
887
888http://www.freebsd.org/cgi/man.cgi?query=rwlock
889
890POSIX r/w lock.
891
892=== RMLOCK(9) (Reader/writer lock optimized for mostly read access patterns) ===
893
894Note:  This object was implemented as a wrapper for RWLOCK in the rm_lock header file.
895
896http://www.freebsd.org/cgi/man.cgi?query=rmlock
897
898POSIX r/w lock.
899
900=== CONDVAR(9) (Condition variables) ===
901
902http://www.freebsd.org/cgi/man.cgi?query=condvar
903
904POSIX condition variables with modifications (hack).
905
906=== CALLOUT(9) (Timer functions) ===
907
908http://www.freebsd.org/cgi/man.cgi?query=callout
909
910Timer server.
911
912=== TASKQUEUE(9) (Asynchronous task execution) ===
913
914http://www.freebsd.org/cgi/man.cgi?query=taskqueue
915
916TBD.
917
918=== KTHREAD(9), KPROC(9) (Tasks) ===
919
920http://www.freebsd.org/cgi/man.cgi?query=kthread
921
922http://www.freebsd.org/cgi/man.cgi?query=kproc
923
924Tasks.
925
926=== ZONE(9) (Zone allocator) ===
927
928http://www.freebsd.org/cgi/man.cgi?query=zone
929
930TBD.
931
932=== devfs (Device file system) ===
933
934Dummy, IMFS or new implementation (currently dummy).
935
936=== psignal (Signals) ===
937
938TBD.  Seems to be not needed.
939
940=== poll, select ===
941
942TBD.  Seems to be not needed.
943
944=== RMAN(9) (Resource management) ===
945
946http://www.freebsd.org/cgi/man.cgi?query=rman
947
948TBD.  Seems to be not needed.
949
950=== DEVCLASS(9), DEVICE(9), DRIVER(9), MAKE_DEV(9) (Device management) ===
951
952http://www.freebsd.org/cgi/man.cgi?query=devclass
953
954http://www.freebsd.org/cgi/man.cgi?query=device
955
956http://www.freebsd.org/cgi/man.cgi?query=driver
957
958http://www.freebsd.org/cgi/man.cgi?query=make_dev
959
960Use FreeBSD implementation as far as possible.  FreeBSD has a nice API for
961dynamic device handling.  It may be interesting for RTEMS to use this API
962internally in the future.
963
964=== BUS_SPACE(9), BUS_DMA(9) (Bus and DMA access) ===
965
966http://www.freebsd.org/cgi/man.cgi?query=bus_space
967
968http://www.freebsd.org/cgi/man.cgi?query=bus_dma
969
970Likely BSP dependent.  A default implementation for memory mapped linear access
971is easy to provide.  The current heap implementation supports all properties
972demanded by bus_dma (including the boundary constraint).
973
974== RTEMS Replacements by File Description ==
975
976Note:  Files with a status of USB are used by the USB test and have at least
977been partially tested.  If they contain both USB and Nic, then they are used
978by both and MAY contain methods that have not been tested yet.  Files that
979are only used by the Nic test are the most suspect.
980
981----
982rtems-libbsd File:      rtems-bsd-assert.c
983FreeBSD File:           rtems-bsd-config.h redefines BSD_ASSERT.
984Description:            This file contains the support method rtems_bsd_assert_func().
985Status:                 USB, Nic
986
987rtems-libbsd File:      rtems-bsd-autoconf.c
988FreeBSD File:           FreeBSD has BSP specific autoconf.c
989Description:            This file contains configuration methods that are used to setup the system.
990Status:                 USB
991
992rtems-libbsd File:      rtems-bsd-bus-dma.c
993FreeBSD File:           FreeBSD has BSP specific busdma_machdep.c
994Description:
995Status:                 USB, Nic
996
997rtems-libbsd File:      rtems-bsd-bus-dma-mbuf.c
998FreeBSD File:           FreeBSD has BSP specific busdma_machdep.c
999Description:
1000Status:                 Nic
1001
1002rtems-libbsd File:      rtems-bsd-callout.c
1003FreeBSD File:           kern/kern_timeout.c
1004Description:
1005Status:                 USB, Nic
1006
1007rtems-libbsd File:      rtems-bsd-cam.c
1008FreeBSD File:           cam/cam_sim.c
1009Description:
1010Status:                 USB
1011
1012rtems-libbsd File:      rtems-bsd-condvar.c
1013FreeBSD File:           kern/kern_condvar.c
1014Description:
1015Status:                 USB
1016
1017rtems-libbsd File:      rtems-bsd-copyinout.c
1018FreeBSD File:           bsp specific copyinout.c )
1019Description:            Note: The FreeBSD file is split with some methods being in rtems-bsd-support
1020Status:                 Nic
1021
1022rtems-libbsd File:      rtems-bsd-delay.c
1023FreeBSD File:           bsp specific file with multiple names
1024Description:
1025Status:                 USB, Nic
1026
1027rtems-libbsd File:      rtems-bsd-descrip.c
1028FreeBSD File:           kern/kern_descrip.c
1029Description:
1030Status:                 Nic
1031
1032rtems-libbsd File:      rtems-bsd-generic.c
1033FreeBSD File:           kern/sys_generic.c
1034Description:
1035Status:                 Nic
1036
1037rtems-libbsd File:      rtems-bsd-init.c
1038FreeBSD File:           N/A
1039Description:
1040Status:                 USB, Nic
1041
1042rtems-libbsd File:      rtems-bsd-init-with-irq.c
1043FreeBSD File:           N/A
1044Description:
1045Status:                 USB, Nic
1046
1047rtems-libbsd File:      rtems-bsd-jail.c
1048FreeBSD File:           kern/kern_jail.c
1049Description:
1050Status:                 USB, Nic
1051
1052rtems-libbsd File:      rtems-bsd-lock.c
1053FreeBSD File:           kern/subr_lock.c
1054Description:
1055Status:                 USB, Nic
1056
1057rtems-libbsd File:      rtems-bsd-log.c
1058FreeBSD File:           kern/subr_prf.c
1059Description:
1060Status:                 Nic
1061
1062rtems-libbsd File:      rtems-bsd-malloc.c
1063FreeBSD File:           kern/kern_malloc.c
1064Description:
1065Status:                 USB, Nic
1066
1067rtems-libbsd File:      rtems-bsd-mutex.c
1068FreeBSD File:           kern/kern_mutex.c
1069Description:
1070Status:                 USB, Nic
1071
1072rtems-libbsd File:      rtems-bsd-newproc.c
1073FreeBSD File:           N/A
1074Description:
1075Status:                 Nic
1076
1077rtems-libbsd File:      rtems-bsd-nexus.c
1078FreeBSD File:           bsp specific nexus.c
1079Description:
1080Status:                 USB
1081
1082rtems-libbsd File:      rtems-bsd-panic.c
1083FreeBSD File:           boot/common/panic.c
1084Description:
1085Status:                 USB, Nic
1086
1087rtems-libbsd File:      rtems-bsd-rwlock.c
1088FreeBSD File:           kern_rwlock.c
1089Description:
1090Status:                 USB, Nic
1091
1092rtems-libbsd File:      rtems-bsd-shell.c
1093FreeBSD File:           N/A
1094Description:
1095Status:                 USB
1096
1097rtems-libbsd File:      rtems-bsd-signal.c
1098FreeBSD File:           kern/kern_sig.c
1099Description:
1100Status:                 Nic
1101
1102rtems-libbsd File:      rtems-bsd-smp.c
1103FreeBSD File:           N/A
1104Description:
1105Status:                 Nic
1106
1107rtems-libbsd File:      rtems-bsd-support.c
1108FreeBSD File:           bsp specific copyinout.c
1109Description:            Note: the FreeBSD file is split with some methods being in rtems-bsd-copyinout.
1110Status:                 USB, Nic
1111
1112rtems-libbsd File:      rtems-bsd-sx.c
1113FreeBSD File:           kern/kern_sx.c
1114Description:            Status: USB, Nic
1115
1116rtems-libbsd File:      rtems-bsd-synch.c
1117FreeBSD File:           kern/kern_synch.c
1118Description:
1119Status:                 USB, Nic
1120
1121rtems-libbsd File:      rtems-bsd-syscalls.c
1122FreeBSD File:           User API for kern/uipc_syscalls.c
1123Description:
1124Status:                 Nic
1125
1126rtems-libbsd File:      rtems-bsd-sysctlbyname.c
1127FreeBSD File:           User API for sysctlbyname(3)
1128Description:
1129Status:
1130
1131rtems-libbsd File:      rtems-bsd-sysctl.c
1132FreeBSD File:           User API for sysctl(8)
1133Description:
1134Status:
1135
1136rtems-libbsd File:      rtems-bsd-sysctlnametomib.c
1137FreeBSD File:           User API for sysctlnametomib
1138Description:
1139Status:
1140
1141rtems-libbsd File:      rtems-bsd-taskqueue.c
1142FreeBSD File:           kern/subr_taskqueue.c
1143Description:
1144Status:                 Nic
1145
1146rtems-libbsd File:      rtems-bsd-thread.c
1147FreeBSD File:           kern/kern_kthread.c
1148Description:
1149Status:                 USB, Nic
1150
1151rtems-libbsd File:      rtems-bsd-timeout.c
1152FreeBSD File:           kern/kern_timeout.c
1153Description:
1154Status:                 Nic
1155
1156rtems-libbsd File:      rtems-bsd-timesupport.c
1157FreeBSD File:           kern/kern_clock.c
1158Description:
1159Status:                 Nic
1160
1161rtems-libbsd File:      rtems-bsd-vm_glue.c
1162FreeBSD File:           vm/vm_glue.c
1163Description:
1164Status:                 USB, Nic
1165----
1166
1167== Notes by File ==
1168
1169altq_subr.c - Arbitrary choices were made in this file that RTEMS would
1170not support tsc frequency change.  Additionally, the clock frequency
1171for machclk_freq is always measured for RTEMS.
1172
1173conf.h - In order to add make_dev and destroy_dev, variables in the cdev
1174structure that were not being used were conditionally compiled out. The
1175capability of supporting children did not appear to be needed and was
1176not implemented in the rtems version of these routines.
1177
1178== NICs Status ==
1179
1180----
1181Driver                  Symbol                          Status
1182======                  ======                          ======
1183RealTek                 _bsd_re_pcimodule_sys_init      Links
1184EtherExpress            _bsd_fxp_pcimodule_sys_init     Links
1185DEC tulip               _bsd_dc_pcimodule_sys_init      Links
1186Broadcom BCM57xxx       _bsd_bce_pcimodule_sys_init     Links
1187Broadcom BCM4401        _bsd_bfe_pcimodule_sys_init     Links
1188Broadcom BCM570x        _bsd_bge_pcimodule_sys_init     Needs Symbols (A)
1189E1000 IGB               _bsd_igb_pcimodule_sys_init     Links
1190E1000 EM                _bsd_em_pcimodule_sys_init      Links
1191Cadence                 ?                               Links, works.
1192----
1193
1194To add a NIC edit rtemsbsd/include/bsp/nexus-devices.h and add the driver
1195reference to the architecture and/or BSP. For example to add the RealTek driver
1196add:
1197
1198SYSINIT_DRIVER_REFERENCE(re, pci);
1199
1200and to add the MII PHY driver add:
1201
1202SYSINIT_DRIVER_REFERENCE(rge, miibus);
1203
1204The PC BSP has these entries.
1205
1206Symbols (A)
1207         pci_get_vpd_ident
1208
1209=== Cadence ===
1210
1211The cadence driver works on the Xilinx Zynq platform. The hardware checksum
1212support works on real hardware but does not seem to be supported on qemu
1213therefore the default state is to disable TXCSUM and RXCSUM and this can be
1214enabled from the shell with:
1215
1216  # ifconfig cgem0 rxcsum txcsum
1217
1218or with an ioctl call to the network interface driver with SIOCSIFCAP and the
1219mask IFCAP_TXCSUM and IFCAP_RXCSUM set.
1220
1221== Problems to report to FreeBSD ==
1222
1223The MMAP_NOT_AVAILABLE define is inverted on its usage.  When it is
1224defined the mmap method is called. Additionally, it is not used
1225thoroughly. It is not used in the unmap portion of the source.
1226The file rec_open.c uses the define MMAP_NOT_AVAILABLE to wrap
1227the call to mmap and file rec_close.c uses the munmap method.
Note: See TracBrowser for help on using the repository browser.