Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
.HTML "Adding Application Support for a New Architecture in Plan 9
2
.TL
3
Adding Application Support for a New Architecture in Plan 9
4
.AU
5
Bob Flandrena
6
bobf@plan9.bell-labs.com
7
.SH
8
Introduction
9
.LP
10
Plan 9 has five classes of architecture-dependent software:
11
headers, kernels, compilers and loaders, the
12
.CW libc
13
system library, and a few application programs.  In general,
14
architecture-dependent programs
15
consist of a portable part shared by all architectures and a
16
processor-specific portion for each supported architecture.
17
The portable code is often compiled and stored in a library
18
associated with
19
each architecture.  A program is built by
20
compiling the architecture-specific code and loading it with the
21
library.  Support for a new architecture is provided
22
by building a compiler for the architecture, using it to
23
compile the portable code into libraries,
24
writing the architecture-specific code, and
25
then loading that code with
26
the libraries.
27
.LP
28
This document describes the organization of the architecture-dependent
29
code and headers on Plan 9.
30
The first section briefly discusses the layout of
31
the headers and the source code for the kernels, compilers, loaders, and the
32
system library, 
33
.CW libc .
34
The second section provides a detailed
35
discussion of the structure of
36
.CW libmach ,
37
a library containing almost
38
all architecture-dependent code
39
used by application programs.
40
The final section describes the steps required to add
41
application program support for a new architecture.
42
.SH
43
Directory Structure
44
.PP
45
Architecture-dependent information for the new processor
46
is stored in the directory tree rooted at \f(CW/\fP\fIm\fP
47
where
48
.I m
49
is the name of the new architecture (e.g.,
50
.CW mips ).
51
The new directory should be initialized with several important
52
subdirectories, notably
53
.CW bin ,
54
.CW include ,
55
and
56
.CW lib .
57
The directory tree of an existing architecture
58
serves as a good model for the new tree.
59
The architecture-dependent
60
.CW mkfile
61
must be stored in the newly created root directory
62
for the architecture.  It is easiest to copy the
63
mkfile for an existing architecture and modify
64
it for the new architecture.  When the mkfile
65
is correct, change the
66
.CW OS
67
and
68
.CW CPUS
69
variables in the
70
.CW /sys/src/mkfile.proto
71
to reflect the addition of the new architecture.
72
.SH
73
Headers
74
.LP
75
Architecture-dependent headers are stored in directory
76
.CW /\fIm\fP/include
77
where
78
.I m
79
is the name of the architecture (e.g.,
80
.CW mips ).
81
Two header files are required:
82
.CW u.h 
83
and
84
.CW ureg.h .
85
The first defines fundamental data types,
86
bit settings for the floating point
87
status and control registers, and
88
.CW va_list
89
processing which depends on the stack
90
model for the architecture.  This file
91
is best built by copying and modifying the
92
.CW u.h
93
file from an architecture
94
with a similar stack model.
95
The
96
.CW ureg.h
97
file
98
contains a structure describing the layout
99
of the saved register set for
100
the architecture; it is defined by the kernel.
101
.LP
102
Header file
103
.CW /sys/include/a.out.h
104
contains the definitions of the magic
105
numbers used to identify executables for
106
each architecture.  When support for a new
107
architecture is added, the magic number
108
for the architecture must be added to this file.
109
.LP
110
The header format of a bootable executable is defined by
111
each manufacturer.  Header file
112
.CW /sys/include/bootexec.h
113
contains structures describing the headers currently
114
supported.  If the new architecture uses a common header
115
such as COFF,
116
the header format is probably already defined,
117
but if the bootable header format is non-standard,
118
a structure defining the format must be added to this file.
119
.LP
120
.SH
121
Kernel
122
.LP
123
Although the kernel depends critically on the properties of the underlying
124
hardware, most of the
125
higher-level kernel functions, including process
126
management, paging, pseudo-devices, and some
127
networking code, are independent of processor
128
architecture.  The portable kernel code
129
is divided into two parts: that implementing kernel
130
functions and that devoted to the boot process.
131
Code in the first class is stored in directory
132
.CW /sys/src/9/port
133
and the portable boot code is stored in
134
.CW /sys/src/9/boot .
135
Architecture-dependent kernel code is stored in the
136
subdirectories of
137
.CW /sys/src/9
138
named for each architecture.
139
.LP
140
The relationship between the kernel code and the boot code
141
is convoluted and subtle.  The portable boot code
142
is compiled into a library for each architecture.  An architecture-specific
143
main program is loaded with the appropriate library and the resulting
144
executable is compiled into the kernel where it is executed as
145
a user process during the final stages of kernel initialization.  The boot process
146
performs authentication, attaches the name space root to the appropriate
147
file system and starts the
148
.CW init
149
process.
150
.LP
151
The organization of the portable kernel source code differs from that
152
of most other architecture-specific code.
153
Instead of storing the portable code in a library
154
and loading it with the architecture-specific
155
code, the portable code is compiled directly into
156
the directory containing the architecture-specific code
157
and linked with the object files built from the source in that directory.
158
.LP
159
.SH
160
Compilers and Loaders
161
.LP
162
The compiler source code conforms to the usual
163
organization: portable code is compiled into a library
164
for each architecture
165
and the architecture-dependent code is loaded with
166
that library.
167
The common compiler code is stored in
168
.CW /sys/src/cmd/cc .
169
The
170
.CW mkfile
171
in this directory compiles the portable source and
172
archives the objects in a library for each architecture.
173
The architecture-specific compiler source
174
is stored in a subdirectory of
175
.CW /sys/src/cmd
176
with the same name as the compiler (e.g.,
177
.CW /sys/src/cmd/vc ).
178
.LP
179
There is no portable code shared by the loaders.
180
Each directory of loader source
181
code is self-contained, except for
182
a header file and an instruction name table
183
included from the
184
directory of the associated
185
compiler.
186
.LP
187
.SH
188
Libraries
189
.LP
190
Most C library modules are
191
portable; the source code is stored in
192
directories
193
.CW /sys/src/libc/port
194
and
195
.CW /sys/src/libc/9sys .
196
Architecture-dependent library code
197
is stored in the subdirectory of
198
.CW /sys/src/libc
199
named the same as the target processor.
200
Non-portable functions not only
201
implement architecture-dependent operations
202
but also supply assembly language implementations
203
of functions where speed is critical.
204
Directory
205
.CW /sys/src/libc/9syscall
206
is unusual because it
207
contains architecture-dependent information
208
for all architectures.
209
It holds only a header file defining
210
the names and numbers of system calls
211
and a
212
.CW mkfile .
213
The
214
.CW mkfile
215
executes an
216
.CW rc
217
script that parses the header file, constructs
218
assembler language functions implementing the system
219
call for each architecture, assembles the code,
220
and archives the object files in
221
.CW libc .
222
The assembler language syntax and the system interface
223
differ for each architecture.
224
The
225
.CW rc
226
script in this
227
.CW mkfile
228
must be modified to support a new architecture.
229
.LP
230
.SH
231
Applications
232
.LP
233
Application programs process two forms of architecture-dependent
234
information: executable images and intermediate object files.
235
Almost all processing is on executable files.
236
System library
237
.CW libmach
238
provides functions that convert
239
architecture-specific data
240
to a portable format so application programs
241
can process this data independent of its
242
underlying representation.
243
Further, when a new architecture is implemented
244
almost all code changes
245
are confined to the library;
246
most affected application programs need only be reloaded.
247
The source code for the library is stored in
248
.CW /sys/src/libmach .
249
.LP
250
An application program running on one type of
251
processor must be able to interpret
252
architecture-dependent information for all
253
supported processors.
254
For example, a debugger must be able to debug
255
the executables of
256
all architectures, not just the
257
architecture on which it is executing, since
258
.CW /proc
259
may be imported from a different machine.
260
.LP
261
A small part of the application library
262
provides functions to
263
extract symbol references from object files.
264
The remainder provides the following processing
265
of executable files or memory images:
266
.IP \(bu
267
Header interpretation.
268
.IP \(bu
269
Symbol table interpretation.
270
.IP \(bu
271
Execution context interpretation, such as stack traces
272
and stack frame location.
273
.IP \(bu
274
Instruction interpretation including disassembly and
275
instruction size and follow-set calculations.
276
.IP \(bu
277
Exception and floating point number interpretation.
278
.IP \(bu
279
Architecture-independent read and write access through a
280
relocation map.
281
.LP
282
Header file
283
.CW /sys/include/mach.h
284
defines the interfaces to the
285
application library.  Manual pages
286
.I mach (2),
287
.I symbol (2),
288
and
289
.I object (2)
290
describe the details of the
291
library functions.
292
.LP
293
Two data structures, called
294
.CW Mach
295
and
296
.CW Machdata ,
297
contain architecture-dependent  parameters and
298
a jump table of functions.
299
Global variables
300
.CW mach
301
and
302
.CW machdata
303
point to the
304
.CW Mach
305
and
306
.CW Machdata
307
data structures associated with the target architecture.
308
An application determines the target architecture of
309
a file or executable image, sets the global pointers
310
to the data structures associated with that architecture,
311
and subsequently performs all references indirectly through the
312
pointers.
313
As a result, direct references to the tables for each
314
architecture are avoided and the application code intrinsically
315
supports all architectures (though only one at a time).
316
.LP
317
Object file processing is handled similarly: architecture-dependent
318
functions identify and
319
decode the intermediate files for the processor.
320
The application indirectly
321
invokes a classification function to identify
322
the architecture of the object code and to select the
323
appropriate decoding function.  Subsequent calls
324
then use that function to decode each record.  Again,
325
the layer of indirection allows the application code
326
to support all architectures without modification.
327
.LP
328
Splitting the architecture-dependent information
329
between the
330
.CW Mach
331
and
332
.CW Machdata
333
data structures
334
allows applications to choose
335
an appropriate level of service.  Even though an application
336
does not directly reference the architecture-specific data structures,
337
it must load the
338
architecture-dependent tables and code 
339
for all architectures it supports.  The size of this data
340
can be substantial and many applications do not require
341
the full range of architecture-dependent functionality.
342
For example, the
343
.CW size
344
command does not require the disassemblers for every architecture;
345
it only needs to decode the header.
346
The
347
.CW Mach
348
data structure contains a few architecture-specific parameters
349
and a description of the processor register set.
350
The size of the structure
351
varies with the size of the register
352
set but is generally small.
353
The
354
.CW Machdata
355
data structure contains
356
a jump table of architecture-dependent functions;
357
the amount of code and data referenced by this table
358
is usually large.
359
.SH
360
Libmach Source Code Organization
361
.LP
362
The
363
.CW libmach
364
library provides four classes of functionality:
365
.LP
366
.IP "Header and Symbol Table Decoding\ -\ "
367
Files
368
.CW executable.c
369
and
370
.CW sym.c
371
contain code to interpret the header and
372
symbol tables of
373
an executable file or executing image.
374
Function
375
.CW crackhdr
376
decodes the header,
377
reformats the
378
information into an
379
.CW Fhdr
380
data structure, and points
381
global variable
382
.CW mach
383
to the
384
.CW Mach
385
data structure of the target architecture.
386
The symbol table processing
387
uses the data in the
388
.CW Fhdr
389
structure to decode the symbol table.
390
A variety of symbol table access functions then support
391
queries on the reformatted table.
392
.IP "Debugger Support\ -\ "
393
Files named
394
.CW \fIm\fP.c ,
395
where
396
.I m
397
is the code letter assigned to the architecture,
398
contain the initialized
399
.CW Mach
400
data structure and the definition of the register
401
set for each architecture.
402
Architecture-specific debugger support functions and
403
an initialized
404
.CW Machdata
405
structure are stored in
406
files named
407
.CW \fIm\fPdb.c .
408
Files
409
.CW machdata.c 
410
and
411
.CW setmach.c
412
contain debugger support functions shared
413
by multiple architectures.
414
.IP "Architecture-Independent Access\ -\ "
415
Files
416
.CW map.c ,
417
.CW access.c ,
418
and
419
.CW swap.c
420
provide accesses through a relocation map
421
to data in an executable file or executing image.
422
Byte-swapping is performed as needed.  Global variables
423
.CW mach
424
and
425
.CW machdata
426
must point to the
427
.CW Mach
428
and
429
.CW Machdata
430
data structures of the target architecture.
431
.IP "Object File Interpretation\ -\ "
432
These files contain functions to identify the
433
target architecture of an
434
intermediate object file
435
and extract references to symbols.  File
436
.CW obj.c
437
contains code common to all architectures;
438
file
439
.CW \fIm\fPobj.c
440
contains the architecture-specific source code
441
for the machine with code character
442
.I m .
443
.LP
444
The
445
.CW Machdata
446
data structure is primarily a jump
447
table of architecture-dependent debugger support
448
functions. Functions select the
449
.CW Machdata
450
structure for a target architecture based
451
on the value of the
452
.CW type
453
code in the
454
.CW Fhdr
455
structure or the name of the architecture.
456
The jump table provides functions to swap bytes, interpret
457
machine instructions,
458
perform stack
459
traces, find stack frames, format floating point
460
numbers, and decode machine exceptions.  Some functions, such as
461
machine exception decoding, are idiosyncratic and must be
462
supplied for each architecture.  Others depend
463
on the compiler run-time model and several
464
architectures may share code common to a model.  For
465
example, many architectures share the code to
466
process the fixed-frame stack model implemented by
467
several of the compilers.
468
Finally, some
469
functions, such as byte-swapping, provide a general capability and
470
the jump table need only select an implementation appropriate
471
to the architecture.
472
.LP
473
.SH
474
Adding Application Support for a New Architecture
475
.LP
476
This section describes the
477
steps required to add application-level
478
support for a new architecture.
479
We assume
480
the kernel, compilers, loaders and system libraries
481
for the new architecture are already in place.  This
482
implies that a code-character has been assigned and
483
that the architecture-specific headers have been
484
updated.
485
With the exception of two programs,
486
application-level changes are confined to header
487
files and the source code in
488
.CW /sys/src/libmach .
489
.LP
490
.IP 1.
491
Begin by updating the application library
492
header file in
493
.CW /sys/include/mach.h .
494
Add the following symbolic codes to the
495
.CW enum
496
statement near the beginning of the file:
497
.RS
498
.IP \(bu
499
The processor type code, e.g., 
500
.CW MSPARC .
501
.IP \(bu
502
The type of the executable.  There are usually
503
two codes needed: one for a bootable
504
executable (i.e., a kernel) and one for an
505
application executable.
506
.IP \(bu
507
The disassembler type code.  Add one entry for
508
each supported disassembler for the architecture.
509
.IP \(bu
510
A symbolic code for the object file.
511
.RE
512
.LP
513
.IP 2.
514
In a file name
515
.CW /sys/src/libmach/\fIm\fP.c
516
(where
517
.I m
518
is the identifier character assigned to the architecture),
519
initialize
520
.CW Reglist
521
and
522
.CW Mach
523
data structures with values defining
524
the register set and various system parameters.
525
The source file for a similar architecture
526
can serve as template.
527
Most of the fields of the
528
.CW Mach
529
data structure are obvious
530
but a few require further explanation.
531
.RS
532
.IP "\f(CWkbase\fP\ -\ "
533
This field
534
contains the address of the kernel 
535
.CW ublock .
536
The debuggers
537
assume the first entry of the kernel
538
.CW ublock
539
points to the
540
.CW Proc
541
structure for a kernel thread.
542
.IP "\f(CWktmask\fP\ -\ "
543
This field
544
is a bit mask used to calculate the kernel text address from
545
the kernel 
546
.CW ublock
547
address.
548
The first page of the
549
kernel text segment is calculated by
550
ANDing
551
the negation of this mask with
552
.CW kbase .
553
.IP "\f(CWkspoff\fP\ -\ "
554
This field
555
contains the byte offset in the
556
.CW Proc
557
data structure to the saved kernel
558
stack pointer for a suspended kernel thread.  This
559
is the offset to the 
560
.CW sched.sp
561
field of a
562
.CW Proc
563
table entry.
564
.IP "\f(CWkpcoff\fP\ -\ "
565
This field contains the byte offset into the
566
.CW Proc
567
data structure
568
of
569
the program counter of a suspended kernel thread.
570
This is the offset to
571
field
572
.CW sched.pc
573
in that structure.
574
.IP "\f(CWkspdelta\fP and \f(CWkpcdelta\fP\ -\ "
575
These fields
576
contain corrections to be added to
577
the stack pointer and program counter, respectively,
578
to properly locate the stack and next
579
instruction of a kernel thread.  These
580
values bias the saved registers retrieved
581
from the
582
.CW Label
583
structure named
584
.CW sched
585
in the
586
.CW Proc
587
data structure.
588
Most architectures require no bias
589
and these fields contain zeros.
590
.IP "\f(CWscalloff\fP\ -\ "
591
This field
592
contains the byte offset of the
593
.CW scallnr
594
field in the
595
.CW ublock
596
data structure associated with a process.
597
The
598
.CW scallnr
599
field contains the number of the
600
last system call executed by the process.
601
The location of the field varies depending on
602
the size of the floating point register set
603
which precedes it in the
604
.CW ublock .
605
.RE
606
.LP
607
.IP 3.
608
Add an entry to the initialization of the
609
.CW ExecTable
610
data structure at the beginning of file
611
.CW /sys/src/libmach/executable.c .
612
Most architectures
613
require two entries: one for
614
a normal executable and
615
one for a bootable
616
image.  Each table entry contains:
617
.RS
618
.IP \(bu
619
Magic Number\ \-\ 
620
The big-endian magic number assigned to the architecture in
621
.CW /sys/include/a.out.h .
622
.IP \(bu
623
Name\ \-\ 
624
A string describing the executable.
625
.IP \(bu
626
Executable type code\ \-\ 
627
The executable code assigned in
628
.CW /sys/include/mach.h .
629
.IP \(bu
630
\f(CWMach\fP pointer\ \-\ 
631
The address of the initialized
632
.CW Mach
633
data structure constructed in Step 2.
634
You must also add the name of this table to the
635
list of
636
.CW Mach
637
table definitions immediately preceding the
638
.CW ExecTable
639
initialization.
640
.IP \(bu
641
Header size\ \-\ 
642
The number of bytes in the executable file header.
643
The size of a normal executable header is always
644
.CW sizeof(Exec) .
645
The size of a bootable header is
646
determined by the size of the structure
647
for the architecture defined in
648
.CW /sys/include/bootexec.h .
649
.IP \(bu
650
Byte-swapping function\ \-\ 
651
The address of
652
.CW beswal
653
or
654
.CW leswal
655
for big-endian and little-endian
656
architectures, respectively.
657
.IP \(bu
658
Decoder function\ -\ 
659
The address of a function to decode the header.
660
Function
661
.CW adotout
662
decodes the common header shared by all normal
663
(i.e., non-bootable) executable files.
664
The header format of bootable
665
executable files is defined by the manufacturer and
666
a custom function is almost always
667
required to decode it.
668
Header file
669
.CW /sys/include/bootexec.h
670
contains data structures defining the bootable
671
headers for all architectures.  If the new architecture
672
uses an existing format, the appropriate
673
decoding function should already be in
674
.CW executable.c .
675
If the header format is unique, then
676
a new function must be added to this file.
677
Usually the decoding function for an existing
678
architecture can be adopted with minor modifications.
679
.RE
680
.LP
681
.IP 4.
682
Write an object file parser and
683
store it in file
684
.CW /sys/src/libmach/\fIm\fPobj.c
685
where
686
.I m
687
is the identifier character assigned to the architecture.
688
Two functions are required: a predicate to identify an
689
object file for the architecture and a function to extract
690
symbol references from the object code.
691
The object code format is obscure but
692
it is often possible to adopt the
693
code of an existing architecture
694
with minor modifications.
695
When these
696
functions are in hand, insert their addresses
697
in the jump table at the beginning of file
698
.CW /sys/src/libmach/obj.c .
699
.LP
700
.IP 5.
701
Implement the required debugger support functions and
702
initialize the parameters and jump table of the
703
.CW Machdata
704
data structure for the architecture.
705
This code is conventionally stored in
706
a file named
707
.CW /sys/src/libmach/\fIm\fPdb.c
708
where
709
.I m
710
is the identifier character assigned to the architecture.
711
The fields of the
712
.CW Machdata
713
structure are:
714
.RS
715
.IP "\f(CWbpinst\fP and \f(CWbpsize\fP\ -\ "
716
These fields
717
contain the breakpoint instruction and the size
718
of the instruction, respectively.
719
.IP "\f(CWswab\fP\ -\ "
720
This field
721
contains the address of a function to
722
byte-swap a 16-bit value.  Choose
723
.CW leswab
724
or
725
.CW beswab
726
for little-endian or big-endian architectures, respectively.
727
.IP "\f(CWswal\fP\ -\ "
728
This field
729
contains the address of a function to
730
byte-swap a 32-bit value.  Choose
731
.CW leswal
732
or
733
.CW beswal
734
for little-endian or big-endian architectures, respectively.
735
.IP "\f(CWctrace\fP\ -\ "
736
This field
737
contains the address of a function to perform a
738
C-language stack trace.  Two general trace functions,
739
.CW risctrace
740
and
741
.CW cisctrace ,
742
traverse fixed-frame and relative-frame stacks,
743
respectively.  If the compiler for the
744
new architecture conforms to one of
745
these models, select the appropriate function.  If the
746
stack model is unique,
747
supply a custom stack trace function.
748
.IP "\f(CWfindframe\fP\ -\ "
749
This field
750
contains the address of a function to locate the stack
751
frame associated with a text address.
752
Generic functions
753
.CW riscframe
754
and
755
.CW ciscframe
756
process fixed-frame and relative-frame stack
757
models.
758
.IP "\f(CWufixup\fP\ -\ "
759
This field
760
contains the address of a function to adjust
761
the base address of the register save area.
762
Currently, only the
763
68020 requires this bias
764
to offset over the active
765
exception frame.
766
.IP "\f(CWexcep\fP\ -\ "
767
This field
768
contains the address of a function to produce a
769
text
770
string describing the
771
current exception.
772
Each architecture stores exception
773
information uniquely, so this code must always be supplied.
774
.IP "\f(CWbpfix\fP\ -\ "
775
This field
776
contains the address of a function to adjust an
777
address prior to laying down a breakpoint.
778
.IP "\f(CWsftos\fP\ -\ "
779
This field
780
contains the address of a function to convert a single
781
precision floating point value
782
to a string.  Choose
783
.CW leieeesftos
784
for little-endian
785
or
786
.CW beieeesftos
787
for big-endian architectures.
788
.IP "\f(CWdftos\fP\ -\ "
789
This field
790
contains the address of a function to convert a double
791
precision floating point value
792
to a string.  Choose
793
.CW leieeedftos
794
for little-endian
795
or
796
.CW beieeedftos
797
for big-endian architectures.
798
.IP "\f(CWfoll\fP, \f(CWdas\fP, \f(CWhexinst\fP, and \f(CWinstsize\fP\ -\ "
799
These fields point to functions that interpret machine
800
instructions.
801
They rely on disassembly of the instruction
802
and are unique to each architecture.
803
.CW Foll
804
calculates the follow set of an instruction.
805
.CW Das
806
disassembles a machine instruction to assembly language.
807
.CW Hexinst
808
formats a machine instruction as a text
809
string of
810
hexadecimal digits.
811
.CW Instsize
812
calculates the size in bytes, of an instruction.
813
Once the disassembler is written, the other functions
814
can usually be implemented as trivial extensions of it.
815
.LP
816
It is possible to provide support for a new architecture
817
incrementally by filling the jump table entries
818
of the
819
.CW Machdata
820
structure as code is written.  In general, if
821
a jump table entry contains a zero, application
822
programs requiring that function will issue an
823
error message instead of attempting to
824
call the function.  For example,
825
the
826
.CW foll ,
827
.CW das ,
828
.CW hexinst ,
829
and
830
.CW instsize
831
jump table slots can be zeroed until a
832
disassembler is written.
833
Other capabilities, such as
834
stack trace or variable inspection,
835
can be supplied and will be available to
836
the debuggers but attempts to use the
837
disassembler will result in an error message.
838
.RE
839
.IP 6.
840
Update the table named
841
.CW machines
842
near the beginning of
843
.CW /sys/src/libmach/setmach.c .
844
This table binds the
845
file type code and machine name to the
846
.CW Mach
847
and
848
.CW Machdata
849
structures of an architecture.
850
The names of the initialized
851
.CW Mach
852
and
853
.CW Machdata
854
structures built in steps 2 and 5
855
must be added to the list of
856
structure definitions immediately
857
preceding the table initialization.
858
If both Plan 9 and
859
native disassembly are supported, add
860
an entry for each disassembler to the table.  The
861
entry for the default disassembler (usually
862
Plan 9) must be first.
863
.IP 7.
864
Add an entry describing the architecture to
865
the table named
866
.CW trans
867
near the end of
868
.CW /sys/src/cmd/prof.c .
869
.RE
870
.IP 8.
871
Add an entry describing the architecture to
872
the table named
873
.CW objtype
874
near the start of
875
.CW /sys/src/cmd/pcc.c .
876
.RE
877
.IP 9.
878
Recompile and install
879
all application programs that include header file
880
.CW mach.h
881
and load with
882
.CW libmach.a .