tag:blogger.com,1999:blog-327970702024-03-03T10:06:45.162-07:00Warner's Random Hacking BlogA Diary of Warner's Hacking Projects and other random thoughtsWarner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.comBlogger217125tag:blogger.com,1999:blog-32797070.post-49925986087840305112023-12-22T00:18:00.003-07:002023-12-22T00:18:49.672-07:00FreeBSD/armv7 in Qemu<h1 style="text-align: left;">Armv7 Virtualization</h1><div style="text-align: left;">Just a quick note for booting an FreeBSD/armv7 virtual machine. I'll document a few bumps that I hit along the way. We'll be booting with qemu's virt armv7 virutal machine. We'll use EDK II as the firmware. </div><div style="text-align: left;"><br /></div><h2 style="text-align: left;">The Setup: required packages</h2><div style="text-align: left;">Before we get started, we need to install a few things. Thankfully, they are all installed with one command:</div><blockquote><div style="text-align: left;">% sudo pkg install qemu</div></blockquote><p>As of this wrirting, I used qemu 8.1.3, though I've done this with older versions. I suspect that 8.2 will be fine, but I haven't tried it yet.</p><h2 style="text-align: left;">The Setup: EDK2 prep</h2><blockquote><div>% mkdir qemu-armv7</div><div>% cd qemu-armv7</div><div>% dd if=/dev/zero of=pflash0.img bs=1m count=64</div><div>% dd if=/dev/zero of=pflash1.img bs=1m count=64</div><div>% dd if=/usr/local/share/qemu/edk2-arm-code.fd of=pflash0.img conv=notrunc</div><div>% dd if=/usr/local/share/qemu/edk2-arm-vars.fd of=pflash1.img conv=notrunc</div></blockquote><p>This will create the needed flash images. pflash0.img can be shared among all the VMs you want, but you should have a specific pflash1.img per VM (though if you don't set any specific UEFI environment variables, it could be shared since you won't have multiple writers). There's no easy way to manage the per-VM vars file if you need to have different and do this on a large scale.</p><h2 style="text-align: left;">The Setup: A quick QEMU script</h2><blockquote><div>#!/bin/sh</div><div>qemu-system-arm \</div><div> -M virt \</div><div> -m 512 \</div><div> -drive file=pflash0.img,format=raw,if=pflash,readonly=on \</div><div> -drive file=pflash1.img,format=raw,if=pflash \</div><div> -drive file=$1.img,if=virtio,cache=writethrough \</div><div> -nographic</div></blockquote><p>Will run whatever image you want to download. I run the GENERICSD.img that we publish. FreeBSD-13.2-RELEASE-arm-arm7-GENERICSD.img for example. You'll need to specify the image name. The virutal machine for arm, at least, will include the virtio network device (vtnet) if no other network is specified. Handy for scripts, but not always a good thing... </p><h2 style="text-align: left;">The bug: vtnet</h2><div style="text-align: left;"> The above won't actually work. At least with 13.2 and 14.0 and earlier. There's a bug in virtio on armv7. The FreeBSD TCP/IP requires that packets be aligned such that they can be accessed via structures that define them. On most architectures, that allow unaligned access, this isn't a problem. However, on armv7, you can't do unalgined accesses in the kernel. Arm fixed this with aarch64, but not the older 32-bit arm. So if you were to try the above, you'd get an alignment fault when the image is getting its IP address and the kernel receives a UDP packet. I've since fixed this bug (maybe wrong, it turns out, but that's another story that will be sorted soon).</div><div style="text-align: left;"><br /></div><div style="text-align: left;">So, to run these earlier versions, you need to specify a network device. I've used the old 8139 PCI device, which works in 13.2 and 14.0. Add the following line after the last drive line.</div><blockquote><div style="text-align: left;">-device rtl8139,netdev=network0 -netdev user,id=network0 \</div></blockquote><div style="text-align: left;">and that will create a rl device, which the arm GENERICSD image can boot.</div><h2 style="text-align: left;">Wrap Up</h2><div style="text-align: left;">That's about it. The image is what you'd expect. root/root can log you into the console. You can ssh in with freebsd/freebsd and su. If you have other users around, or are doing this on a public-ish network, you'll want to change these passwords right away.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">There's several FreeBSD forum entries on this. I culled the script from <a href="https://forums.freebsd.org/threads/run-boot-freebsd-arm-32bit-image-in-qemu.80765/">run / boot freebsd arm 32bit image in qemu</a>, though this matches a lot of other recipes online.</div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com0tag:blogger.com,1999:blog-32797070.post-48506049389005865962023-07-24T16:49:00.004-06:002023-07-24T16:49:47.878-06:00Some Hints For Splitting Commits <h1>Some Hints For Splitting Commits</h1>
<p>Sometimes in a code review, the commentators suggest that commits be broken
up into smaller pieces. Here are a few of the collected tricks I have
learned over the years. They are presented as 'editing the current tip
of the tree' for simplicity. However, you can apply them to rebasing
as well using the 'edit' action. The last section offers a strategy when
you need to recombine the commits.</p>
<h2>Splitting up</h2>
<p>Sometimes you have a commit that you need to split up. This section will
show you how to do that. Briefly, you will reset the <code>HEAD</code> of the tree to remove the commit from the current branch (the original
hash remains in the repo), and then add and commit it piecemeal.</p>
<p>Before we get started on doing the change, there’s two steps to do:</p>
<ul>
<li>
<p>Run <code>git status</code> to ensure the tree is clean.<br> If the
tree is unclean, then you can lose changes in the following steps
(or have them accidentally merged in).</p>
</li>
<li>
<p>Run <code>git show</code> to show the commit you are working on.<br> This is especially important when using these steps when doing a
<code>git rebase -i</code> with and edit step.<br> It also helps
to know what the whole change looks like.</p>
</li>
</ul>
<p>Now, to 'undo' the change from the repository, make sure the changes are
what we think, then redo the changes.</p>
<ul>
<li>
<p>Run <code>git reset HEAD^</code> to 'undo' the change.<br> This will
set the pseudo-tag <code>ORIG_HEAD</code> to the value of <code>HEAD</code> before this command.</p>
</li>
<li>
<p>Run <code>git diff</code> and ensure that the diff matches the diff
part of the <code>git show</code> you did earlier.</p>
</li>
<li>
<p>Run <code>git add -ip</code> to interactively select the subset of
the change you want.<br> There are instructions for how to edit the
context diff at the end of the diff, so I won’t go over them
here.</p>
</li>
<li>
<p>Run <code>git commit -c ORIG_HEAD</code> to commit the change.<br> This commits the change and copies the commit message fro the pseudo-tag
<code>ORIG_HEAD</code>.<br> More often than not, when you are splitting
changes, you will want a subset of the original message, or to edit
it somehow.</p>
</li>
<li>
<p>Run <code>git diff</code> to see what’s left to commit.<br> Repeat
the last two steps until there’s no more changes left.<br>
<code>git commit</code> does not move <code>ORIG_HEAD</code> so you
will start with the right commit message each time.</p>
</li>
</ul>
<p>If you are really operating on the last change in your patch series, you
are now done: the patch is split up. If you are doing this inside a <code>git rebase -i</code> with an <code>edit</code> action for the step, do not forget to now run
<code>git rebase --continue</code> to complete the process. I usually
just edit one at a time to keep things simple (I often forget to do the
<code>git rebase --continue</code> if I have too many things to edit).</p>
<h2 id="_rearranging_the_commits">Rearranging the commits.</h2>
<p>Sometimes, you have 2 commits that should be 2 different commits, or some
similar rearrangement. Each of the new commits have parts of the original
commits. What I like to do here is take the original two commits and
break them down into the basic parts using the previous section. So I
break the first commit down into the commit into 2 new commits. I repeat
the process for the second commit. There are now 4 commits in my branch.
I usually keep the original commit messages intact and do not edit them
at this stage. I then use <code>git rebase -i</code> to recombine them
using the 'squash' action. This gives me the new commits with copies
of the original two commits' commit messages so I can edit each one down
appropriately. I find that doing this in multiple steps makes it easier
to keep track of everything. This allows easy backing out half way through
if you realize you have done something in error. Doing only one or a
few things at a time makes it easier to do that.
<code>git reflog</code> can also help if you made a mistake several steps
ago.</p>
Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com0tag:blogger.com,1999:blog-32797070.post-7291632529286236042022-06-06T10:38:00.002-06:002022-06-06T10:38:26.592-06:00DEC Rainbow Floppies Found on EBAY<h1 style="text-align: left;"> DEC Rainbow Floppies on EBAY</h1><div>A group called "Australia SDC" recently liquidated their DEC Rainbow floppy collection on EBAY. I won the auction and will be placing them up once I have them imaged. There were a lot of application floppies that I'll do a separate blog post about (about half of the lot are programs like tk-solver, 20/20, MT Pascal, CBASIC, etc)</div><div><br /></div><div>However, interestingly they had the following floppies that contain drivers for 3rd party software:</div><div><ul style="text-align: left;"><li>DM220 Disk Utilities -- Drivers for Duncan Mac Donald products (Version 1.0 4/14/1986 MS/DOS)</li><li>DEC RAINBOW MS-DOS 2.05 for ACT WINCHESTER (believed to be a boot disk with the ACT Winchester driver included, ala the Univation disk controllers that did a similar trick)</li><li>DEC RAINBOW 100 CP/M-86 for the ACT Winchester v28.09.84</li><li>C.H.S. Corp XDRV.SYS Version 1.0 Rainbow MS-DOS format (this is for CHS's dual hard disk controller)</li><li>Rainbow Diag Disk (8087 co-processor and extended memory BL-DE29A-BV</li><li>O.P. SYSTEM For Rainbow Winchester Utility/Diag Disk BL-W968B-M3</li><li>Winchester Utility/Diag Disk DOS 2.11 (BL-w968B-M3)</li><li>ZV0003.M3 V2.0 util/diag disk (hand written: R-Bow Hard disk Util) BL-W968B-M3</li><li>Winchester Utility/Diag disk BL-W968B-M3</li></ul><div>The last 4 appear to be the same disk, but they have radically different labels, so it's unclear what else might be on the disks.</div><div><br /></div><div>There's about 20 unlabeled RX-50s in the cache as well. One of them says 'backup 1986' on it, but no clue if that's a complete backup, or just someone's hack to xfer something. I'll do a blog on that as well.</div></div><div><br /></div><div>The Duncan Mac Donald products diskette is interesting, since I've since ads for his products for the Rainbow, but no actual drivers. The ACT Winchester is interesting. I'll have to look at that in detail as well. I have another copy of the CHS diskette, and the driver is included on SS MS-DOS 3.10b disks that I have, but you never know what else might be there.</div><div><br /></div><div>all in all, an interesting find.</div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com0tag:blogger.com,1999:blog-32797070.post-68135604608853870832022-03-31T14:44:00.005-06:002022-03-31T14:44:56.647-06:00DEC Rainbow Power Supply Specs<h1 style="text-align: left;"> DEC Rainbow 100B Power Supply Specs</h1><div><br /></div><div>For the next time I'm looking for this... The DEC Rainbow power supply, as documented in the TM100 technical reference manual, is:</div><div><br /></div><div>Output: +5.1V +/- 6% 2.5-11.5A, +12.1V +/- 6% 0.6-6.7A, -12V +/- 7% 0.0-0.15A</div><div>Input: 115V 6A (218W)</div><div><br /></div><div>Pinout:</div><div><br /></div><div>Pin Function</div><div>1 ACOK H</div><div>2 DCBIAS (unused)</div><div>3 Key</div><div>4 -12V Input</div><div>5,6 +12V Input</div><div>7,8,9 +5V Input</div><div>10,11,12,13 Ground (DC Return)</div><div><br /></div><div>Most ATX power supplies supply more 5V and less 12V than is needed for the Rainbow to power the system. However, the 12V supplies are in large part for the older disk technology in the Rainbow and if you are using emulators you can get by with a little less, though how much less is TBD.</div><div><br /></div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com0tag:blogger.com,1999:blog-32797070.post-82030545427200883622021-10-02T11:09:00.002-06:002021-10-02T11:10:28.798-06:00Spelling Fixes -- Some Advice<h1 style="text-align: left;"> Some Thoughts on Spelling Fixes</h1><div>I've been looking at a number of FreeBSD pull requests lately. Many of them are spelling fixes. I'd like to offer some suggestions for people submitting them. The same advice applies to typo fixes and grammar corrections.</div><div><h3><ol style="text-align: left;"><li>Keep number of changes small.</li><li>Use separate commits per directory</li><li>Use descriptive commit messages</li><li>Set your email correctly</li><li>Don't correct code</li></ol></h3><h3 style="text-align: left;">Keep number of changes small</h3><div><span style="font-weight: 400;">When submitting like this, limit the number of changes to 10-20. More than about 15 changes becomes hard to review. Every single change has to be verified for correctness, and having too many will make your pull request more likely to be overlooked.</span></div><h3 style="text-align: left;">Use separate commits per directory</h3><div><span style="font-weight: 400;">When submitting a number of changes, do one change per subdirectory. When subdirectories are nested, it's OK. For example, if you have changes to bin/ls and bin/rm, do two commits. But if you have changes to both </span><span style="font-weight: 400;">usr.sbin/wpa/wpa_priv and </span><span style="font-weight: 400;">usr.sbin/wpa/wpa_cli, then it's OK to do those as one commit.</span></div></div><h3 style="text-align: left;">Use descriptive commit messages</h3><div>The commit message "fix spelling" is too generic to be useful. If you are fixing just one word, a better commit message would be "Spell interrupt correctly". It also allows the reviewer to make sure that you are changing the right thing. And it also gives enough detail that people skimming the logs don't need to look at the diffs to know what changed. If you are fixing multiple spelling errors, then a generic message is more appropriate.</div><h3 style="text-align: left;"><span style="font-size: 18.72px;">Set your email correctly</span></h3><div><span>When you push your branch to github, make sure that you've set the email you want in the commit message. It saves a lot of time. If you are using github's editor, make sure that your profile has this information set correctly.</span></div><h3 style="text-align: left;">Don't correct code</h3><div>Don't make spelling corrections in code variables, #defines, etc. These will likely be ignored. The risk from a comment or an error message being corrected is tiny, while code changes could be attempts to subtly change the system or introduce security impacting issues through a supply chain attack. It's better to work with someone in the community to get these corrected than to correct them via a pull request.</div><div><br /></div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com2tag:blogger.com,1999:blog-32797070.post-23325482053321485562021-08-28T17:47:00.002-06:002021-08-28T17:47:44.979-06:00A new path: vm86-based venix emulator<h2 style="text-align: left;"> Venix Emulator Update</h2><div>It's been a while since I've had time to work on the Venix emulator. When I set it aside over a year ago, I'd taken it as far as I could with the 8088 emulator I'd found online. It had no FP emulation and there were</div><div>a number of things misbehaving that I couldn't quite get right. And exec was proving hard to implement. Despite being written in C++, the original emulator resisted my efforts to make multiple instantiations.</div><div><br /></div><div>So I set it aside last May, thinking I might get back to it when the qemu bsd-user changes FreeBSD has done have been upstreamed.</div><div><br /></div><div>The first of August I took some time off from work and got the bsd-user changes in shape to upstream. Well, the first 10% of the changes that were the hardest since it was replacing what was there with something that minimally worked. This helped me learn qemu's x86 CPU much better and it got me thinking that qemu's user-mode stuff might be the way to go.</div><div><br /></div><div>About this time I also found a vm86 test program in the FreeBSD tree. So I got to wondering, could I do a vm86 implementation of Venix?</div><div><br /></div><div>So, I stole the bulk of my old 86sim-based Venix implementation, installed a i386 VM using bhyve on my FreeBSD/amd64 box and write a quick little test program. The test program worked, so in a fit of "why not give this a try" I ported the pcvenix.cc from 86sim to being driven from SIGSEGV in vm86 mode. Hello world quickly worked.</div><div><br /></div><h2 style="text-align: left;">Enter VM86VENIX</h2><div>So, I reworked fork and exec and the a.out loader a bit. I was able to get the C compiler going in this new setup. The 'cc' command is just a fancy script that strings together the pre-processor, compiler, optimizer, assembler and linker. Except on Venix it wasn't a shell script I could hack to run natively on FreeBSD. It was this weird binary that did all the forking, execing, redirecting, etc inline. More on that in a minute.</div><div><br /></div><div>So vm86 mode is a special mode in 32-bit CPUs that lets you execute old 16-bit code in the context of a normal process. It's super easy to setup, but often of limited use.</div><div><br /></div><div>Thankfully, the i386 ELF designers thought ahead. The starting address for binaries in ELF is this weird 0x00401430, which is just above 4MB. This means that one can map anything into low memory and it will work. FreeBSD has a security stop on mapping anything at location 0, however, but the rest of the first 4MB is available. The old 8086 could only see the first 1MiB of that, but since Venix binaries are at worst 'small-mode' the largest address space for a process was 128kiB. Plenty of room to find a place to map it.</div><div><br /></div><div>So, I wrote a loader that would load the old Venix a.out binaries into this space. Or rather I hacked the loader I already had to do the mapping. I was able to reuse all the loader code from the 86sim-based emulator I had before.</div><div><br /></div><div>I then shamelessly stole the setup code from the FreeBSD vm86 testing binary, which was little more than establishing signal handlers and zeroing the context and setting up a stack and IP as well as the segment registers. With that in hand, I was able to use sigreturn() to set the processor flags such that it would jump to where I wanted to go in the Venix binary. I'd been afraid of vm86 mode after reading through doscmd years ago, but there was no need for the fear: all the cruft in doscmd (I reread it after this) was the accumulation of cruft over the years for DOS, BIOS and other weirdness that evolved around the IBM PC, XT, AT and the plethora of clones which had nothing to do with vm86 mode, per se.</div><div><br /></div><div>Every INT xx instruction would trap to the kernel. The kernel would note down the registers and send the process a SIGSEGV for these accesses. I was able to then look at CS:IP in the mcontext and decode the instruction that faulted. INT xx is encoded as the bytes 0xCD 0xXX for almost all values of X (INT3 has its own opcode 0xCC). In the signal handler, I could decode this opcode. I knew from past work that INT 0xf1 was the system call, so I hooked up the old venix system call handlers to this and I was back to where I was with 86sim. Further in fact because floating point worked.</div><div><br /></div><div>Signal handlers have an implicit sigreturn with the context passed to the signal handler at the end. I needed to skip over the faulting instruction after performing the system call, and the process would then resume executing in 16-bit mode after the INT 0xf1. This was straight forward to implement.</div><div><br /></div><div>I decided to implement fork as a real fork. It would copy the address space, all the open FDs, etc. This proved to be an easy way to cheat so I didn't have to create a context object and use threads to simulate processes.</div><div><br /></div><div>Exec proved to be just a call to my loader that started all this off. The only thing I've not implemented is close on exec, but the rest was easy.</div><div><br /></div><div>With these implemented, I could run the C compiler's cc command and generate trivial binaries. But if I needed to include anything, it would fail. I created a VENIX_ROOT env variable. For all opens, it would try VENIX_ROOT / name and then just the plain name if the name arg to open started with a '/'. This was enough for the preprocessor to include .h files and for the canonical hello world to build.</div><div><br /></div><div>There was just one vexing problem: cc -o hello hello.c worked. However cc -O -o hello hello.c didn't.</div><h2 style="text-align: left;">Tracking down a silly bug</h2><div>Well, there was another annoying thing: /bin/sh didn't work. I traced that to the fact I've not implemented passing an environment to the processes, and /bin/sh was choking on that. OK. Fine. I'll implement that later. /bin/csh worked, however, so I was happy. My happiness was short lived, alas, because I'd run a command and I'd get weird output:</div><blockquote>% ls<br />ls: Sig 44<br />% </blockquote><p> That's weird. So I added tracing. I tried the cc command, which in this version is a simple program that orchestrates all the different parts of the compiler using fork, exec, dup and the strategic close/open pair to setup stdin etc. All the tracing looked good as well, we'd see something like:</p><blockquote><p>123: fork() 124<br />123: wait()<br />124: ... lots of stuff<br />124: exit 0<br />123: wait pid 124 status 0</p></blockquote><p> and then 123 would proceed to delete all the temp files and exit. It was like it was getting an error, despite its children exiting without an error. Every time it was like this, but only when I ran the optimizer. When I'd re-run the ls test, I'd get different Sig values as well.</p><h3 style="text-align: left;">Available 8086 compilers in 1985</h3><div>So, I'd assumed that the compiler was derived from the V7 compiler. However, a number of hints in names suggested it wasn't. And the Venix manual had way more exceptions for 8086 than for pdp-11 when it described the options and operation for Intel, so I assumed it wasn't V7 derived. So I started hunting around for C compilers.</div><div><br /></div><div>MIT produced one at the time for the PC. It could run on the VAX and generated a.out binaries that a conversion program would convert to .COM or .EXE files. I thought this might be where the Venix compiler came with. But after playing around with it for a few hours it was clear it wasn't. First, it had a shell script cc, not a program. Second, it had a number of VAX specific instructions sprinkled inline, and that wasn't going to run on the Rainbow :).</div><div><br /></div><div>I took a look at the portable C compiler. This I think was the real genesis of what was shipped with Venix, but old versions that support 8086 are hard to come by, even in the successor portable C compiler project that's been going for 20-odd years now. I got the cc program from that compiling with Venix. It was a bit easier to fuss around with than the V7 one (but the V7 one would be close enough to hit the bug I found out later). Looking at the old System III sources that one can find on the internet, there's a copy of the portable C compiler there, rather than the C compiler from DMR as you'll find in the 7th edition. I used the cc program from there to try to build things. I hit the jackpot: it failed faster!</div><div><br /></div><div>So I instrumented the pcc program and discovered that the status printed after wait() in the program didn't match the status that I'd returned from the kernel. Progress!</div><div><br /></div><h3 style="text-align: left;">The wait(2) system call...</h3><div>I'd implemented the wait(2) system call as part of getting fork/exec working. I did it from the VENIX manual that's available online. I looked at the first part of the manual:</div><blockquote><div>SYNOPSIS<br /> wait(statusp)<br /> int *statusp;</div></blockquote><p>which shows wait taking a pointer. So I assumed this was what the kernel received in the first arg that's passed into the kernel (DX). I assumed that DS:DX pointed to an integer where I'd return the status. Most of the time, DX was something that looked like a pointer on the stack, so I just did a copyout. The problem is that's not right.</p><p>So, I took another look at the manual. At the end of the man page I saw:</p><blockquote><p>8086 BX=7<br /> int 0xf1<br /> AX = pid of process<br /> DX = status</p></blockquote><p>and then it hit me. DX isn't a pointer to anything. After int 0xf1 AX is the pid of the process (the normal return value) and DX is the status. Disassembling wait.o confirmed this:if statusp is not 0, dx is copied back to *statusp. Doh! The classic pointer vs value mistake. Fixing my implementation to take out the copyout and replace it with setting DX in the processor context made pcc work. And cc worked. And the silly test programs I wrote in the middle to debug things worked. Woo Hoo!</p><p>Once I fixed this, all weird combinations of compilations suddenly worked for me. I could optimize, strip, etc and there were no oddities.</p><h2 style="text-align: left;">Conclusion</h2><div>It helps to read the manual carefully!</div><div><br /></div><div>I need to try to build the system. There's shell scripts to do that that don't depend on environment variables working if run natively, so I'll see if they work and see how much of the system I can generate via this route. Stay tuned.</div><div><br /></div><div>My TODO list still contains getting env working (I don't think it is hard, but I think I need to filter things because my default env is larger than the stack on these old x86 machines). I also need to look at rebasing my emulator as a *-user qemu emulator (even if they don't take it upstream). Maybe even add PC/IX and Xenix/86 support as well so that other researchers can play around with this.</div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com0tag:blogger.com,1999:blog-32797070.post-85499418339213563272021-05-01T11:40:00.001-06:002021-05-01T11:40:42.061-06:00On Updating QEMU's bsd-user fork<h2 style="text-align: left;"> QEMU bsd-user</h2><div>bsd-user is a 'user mode' emulation tool. It emulates FreeBSD's system calls on FreeBSD well, and $OTHER-BSD system calls elsewhere to varying degrees of success. It's primary mission has been to build FreeBSD packages using user-mode emulation to speed the process over using system mode. It speeds things up because the compilers and other huge CPU hogs can be built natively.</div><div><br /></div><div>Of late, it has languished, A few years ago, I started to rebase it to the then-tip of qemu in the hopes of upstreaming. At the time, we'd forked off of qemu 1.0 or so. During this time the then-current qemu was 4.0. I got things rebased to around 3.1 before running out of steam. Rebasing patch trains of 1000 commits is hard, and trying to selectively squash commits wasn't much better. So that's where things stalled. All bug fixes to qemu bsd-user had gone on in our own private branch.</div><div><br /></div><div>Recently, I'd been asked about it again, so I started to dust things off. I got my name listed as the maintainer so I could push patches upstream a little more easily, and then started contributing by doing basic cleanup in the hopes of redoing 'logically' what had been done to split things up. Those efforts too have come to naught.</div><div><br /></div><div>So, in one final act of desperation, I copied the 3.1-rebased bsd-user directory directly into qemu 6.0 and got it building. There were lots of little changes I needed, but nothing super huge. I've not done extensive testing, but the basics seem to work.</div><div><br /></div><div>Trouble was, that diff was 35k lines. Too big to upstream in one go. So, I set out to see what could be done.</div><div><br /></div><div>First, I labeled the 'yeet it up to current' branch as 'blitz'. It's a fast hack to get something we can move forward on. In the future, releases and such will be cut from there until I can get it into the upstream tree. Blitz is the German word for 'fast' and has connotations of doing something quick and dirty well enough to move on.</div><div><br /></div><div>Next, I created another branch from 6.0 called 'kaizen'. Kaizen is the Japanese business practice of continuous improvement. Find the most painful or most expensive part of your business, fix that and iterate. This branch I'll be putting 'diff reduction' patches for upstream, as well as start to move things over from blitz, starting with the loader. I've disconnected everything except x86 from this branch. In upstream qemu, bsd-user core dumps right away, so I'm not turning off anything that's working.</div><div><br /></div><div>So the plan is that I'll focus on keeping x86 buildable, and get it working as quickly as I can and then add all the system calls from the blitz branch. I'll add them one group at a time, and do the reorgs and new file creation as well. I'll get these reviewed and upstreamed. Once all the system calls are in place, I'll start adding additional architectures as well, getting those patches reviewed too. Finally, I'll get the NetBSD and OpenBSD hosting stuff updated, as well as take a stab at updating their system call tables and seeing how well it works. The work that Stacey Son and others did tried to preserve all this, but it's been a long time since any of it was tested.</div><div><br /></div><div>I have an agreement in principle with the qemu upstream to do all this work. So approximately monthly, I'll be landing a new branch with the latest diff reductions. I'll rebase kaizen and blitz after each drop and before I upstream. For the moment, this work will go into my gitlab fork (since it has all the CI setup on it) and from time to time I'll publish back to the github qemu-bsd-user repo. Be advised: both the blitz and kaizen branches will rebase often, so you may need to do weird things to update. Though, if you are tracking them with changes, please be in touch so we can coordinate work.</div><div><br /></div><div>With luck, by this time next year, the kaizen and blitz branches will be nothing but a distant memory and we'll be on to keeping things up to date in qemu head, maybe with doing some refactoring with linux-user where it makes sense.</div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com0tag:blogger.com,1999:blog-32797070.post-34094451315721361672021-04-16T12:53:00.002-06:002021-04-16T12:53:35.297-06:00 Customizing Emacs for Git Commit Messages<h1 style="text-align: left;"> Customizing Emacs for Git Commit Messages</h1><div>I do a lot of commits to the FreeBSD project and elsewhere. It would be nice if I could setup emacs in a custom way for each commit message that I'm editing.</div><div><br /></div><div>Fortunately, GNU Emacs provides a nice way to do just that. While I likely could do some of these things with git commit hooks, I find this to be a little nicer.</div><div><br /></div><div>First up, we need to do something when we pull up the commit message to edit. By convention, git uses the file COMMIT_EDITMSG, though the exact location of this file depends on where the git tree you have checked out is. Emacs has a hook that's run when emacs starts editing a file called 'find-file-hook'. So:</div><blockquote><div>(add-hook 'find-file-hook 'imp-git-hook)</div></blockquote><p>will do the job nicely. Next up, we need to define this function to do something useful when run (indeed, failure to define it will result in an error when visiting all files).</p><blockquote><p>(defun imp-git-hook ()<br />
(when (string= (file-name-base buffer-file-name) "COMMIT_EDITMSG")<br />
(freebsd-git-setup))) </p></blockquote><p>buffer-file-name is a local variable that has the full path name to the buffer, if any. file-name-base is like basename(1) in that it returns the name of the file without the extension, rather than its whole path.</p><p>But what is 'freebsd-git-setup'? It's a little function I wrote to set the fill column to 72 (I usually have it at 80, but that produces commit messages that are just a bit wide when git adds leading spaces) and adds a sponsorship tag to my commits:</p><blockquote><p>(defun freebsd-git-setup ()<br />
(save-excursion<br />
(setq fill-column 72)<br />
(if (re-search-forward "^Sponsored by:" nil t)<br />
t<br />
if (re-search-forward "^\n#" nil t)<br />
(replace-match "\nSponsored by:\t\tNetflix\n\n#")))))<br /></p></blockquote><p>But it only adds the sponsorship tag if one isn't there yet.</p><p>This is a proof-of-concept function. No doubt it will have to evolve over time. The project adds 'Differential Revision' tags as the last tag in a commit message because differential requires (required?) that. And it wouldn't be good to add this for non-FreeBSD commits, so I'll have to find a way to filter for that... But I thought this would be useful, if nothing else than to my future self as a roadmap for how to do things like this.</p><p><br /></p>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com2tag:blogger.com,1999:blog-32797070.post-26761028944129642942021-01-31T00:59:00.002-07:002021-01-31T00:59:59.347-07:00EPSON QX-10 20MB Hard disk<h1 style="text-align: left;"> EPSON QX-10 20MB Hard Disk</h1><div>I've been looking for some DEC Rainbow 3rd party hard drives of late. QCS (Quality Computer Services) made an external hard disk for the DEC Rainbow. There's advertisements in Digital Review and other trade magazines at the time. It uses a SASI interface, and likely had a DEC Rainbow specific add-in card that they rewarmed from other designs...</div><div><br /></div><div>One recently came up for sale on E-Bay. I thought I'd buy it to check it out. There was no interface card with it, alas. But it was a box with a WD1006 SASI to MFM controller in it that could handle two different drives. The drives were LUN0 and LUN1.</div><div><br /></div><div>SASI, for those that don't know, pre-dates SCSI-1. It's kinda sorta SCSI-1 compatible, if you turn off parity, don't allow the drive to signal attention and restrict yourself to a subset of commands. It also doesn't have INQUIRY so you kinda have to know the size of the drive before hand. Most SASI controller drivers of the day wrote a label to drive with this information since it was always possible to read LBA0 w/o knowing anything else about the drive. Some controllers had ways to at least return a size, though that varied a lot...</div><div><br /></div><div>Since SASI is kinda hard to interface to modern SCSI controllers, I used a MFM reader board I got from David Gesswein over at https://www.pdp8.net/mfm/mfm.shtml to read the drive. I had hoped to find that it was from an old Rainbow and I'd complete my collection of drivers for third party drives...</div><div><br /></div><div>Much to my surprise, I was able to read it without any errors until it hit the manufacturing tracks (480-489). I pulled a full image, then downloaded it to my FreeBSD box for analysis.</div><div><br /></div><div>hexdump -C told me it was a CP/M disk (I recognized the directory format). It was clear right away it wasn't a DEC Rainbow disk, however.</div><div><br /></div><div>The first thing I noticed was the "Bi-Tech Multi Drive Support V4.02" string which indicated who made the driver for it. I also noticed strings like the following</div><blockquote><div>PT.COM for EPSON QX-10 PeachText 5000 date changed - 02/03/84</div></blockquote><p>and similar references to the QX-10 or EPSON CP/M.</p><p>So, this was from a <a href="https://en.wikipedia.org/wiki/Epson_QX-10">Epson QX-10</a> CP/M system. Looks to be a soft-water service company from South Bend Indiana. All their books and correspondence from the mid 1980s was on it, along with some interesting disk support software. There's even some bits of Z80 assembler, but they are too disjointed to know what they were for.</p><p>I've not been able to get cpmtools to read the disk in a structured way, however, so it's hard to share just the interesting bits. Still working on it.</p><p>If you have one of these machines, or are interested in preserving software from it, please let me and we may be able to work something out.</p><p><br /></p><blockquote><div> </div></blockquote><p> </p>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com1tag:blogger.com,1999:blog-32797070.post-81813947737962351812020-10-06T21:01:00.003-06:002020-10-20T10:42:27.068-06:00How to Recover From a BIOS Upgrade<h1 style="text-align: left;">Recovering From Firmware Upgrade</h1><div style="text-align: left;">Recently, I booted Windows on my laptop for the first time in a while to play Portal 2 with my son. It asked me to upgrade, and I said 'sure, upgrade the BIOS.'</div><div style="text-align: left;"><br /></div><div style="text-align: left;">And then I couldn't boot FreeBSD... The BIOS upgrade deleted all the BootXXXX variables. So it only booted Windows. I'm stuck, right? I have to download a FreeBSD image and boot off the USB drive. Or did I?</div><div style="text-align: left;"><br /></div><div style="text-align: left;">Note: Even the update program called updating the firmware updating the BIOS. BIOS is the generic term for the bit of code that runs before the OS. Sadly, it's also the term people use to describe the pre-UEFI boot environment on PCs, so it can be a confusing term to use. Firmware seems a bit better, but it's also ambiguous because different bits of hardware (like wireless cards) also need firmware loaded.</div><div style="text-align: left;"><br /></div><h2 style="text-align: left;">How to Recover</h2><div style="text-align: left;">I was in windows. I needed to mount the system partition (EFI). So, I opened the Administrative Console and got a command prompt from there on the 'Tools' tab. This lead to the familiar C: prompt. I have no W drive. There I was able to copy FreeBSD's boot loader like so:</div><div style="text-align: left;"><br /></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div style="text-align: left;"><span style="font-family: courier; font-size: x-small;">C:\WINDOWS\system32> <span style="color: red;">mountvol w: /s</span></span></div><div style="text-align: left;"><span style="font-family: courier; font-size: x-small;">C:\WINDOWS\system32><span style="color: red;">w:</span></span></div><div style="text-align: left;"><span style="font-family: courier; font-size: x-small;">W:\> <span style="color: red;">cd EFI\Microsoft\Boot</span></span></div><div style="text-align: left;"><span style="font-family: courier; font-size: x-small;">W:\EFI\Microsoft\Boot> <span style="color: red;">ren bootmgfw.efi bootmgfw-back.efi</span></span></div><div style="text-align: left;"><span style="font-family: courier; font-size: x-small;">W:\EFI\Microsoft\Boot> <span style="color: red;">copy W:\EFI\FreeBSD\loader.efi bootmgfw.efi</span></span></div><div style="text-align: left;"><span style="font-family: courier; font-size: x-small;">W:\EFI\Micorsoft\Boot> </span></div></blockquote><div style="text-align: left;"><br /></div><div style="text-align: left;">I then rebooted from the menu.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">I had remembered from my efibootmgr hacking that the boot loader was here. After I booted to FreeBSD, I was able to confirm:</div><div style="text-align: left;"><br /></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;">% <span style="color: red;">sudo efibootmgr -v</span></span></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;">Boot to FW : false</span></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;">BootCurrent: 0001</span></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;">Timeout : 0 seconds</span></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;">BootOrder : 0001, 2001, 2002, 2003</span></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;">+Boot0001* Windows Boot Manager HD(1,GPT,f859c46d-19ee-4e40-8975-3ad1ab00ac09,0x800,0x82000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)</span></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;"> nvd0p1:/EFI/Microsoft/Boot/bootmgfw.efi /boot/efi//EFI/Microsoft/Boot/bootmgfw.efi</span></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;"> Boot2001* EFI USB Device </span></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;"> Boot2002* EFI DVD/CDROM </span></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;"> Boot2003* EFI Network </span></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;"><br /></span></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;"><br /></span></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;">Unreferenced Variables:</span></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;">% </span></div></div></blockquote><div style="text-align: left;"><div><br /></div><div>I was then able to add FreeBSD back with efibootmgr. I mount the ESP on /boot/efi:</div><div><br /></div></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div style="text-align: left;"><div><span style="font-family: courier; font-size: xx-small;">% <span style="color: red;">sudo efibootmgr --create --loader /boot/efi/EFI/freebsd/loader.efi --kernel /boot/kernel/kernel --activate --verbose --label FreeBSD</span></span></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;">Boot to FW : false</span></div></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;">BootCurrent: 0001</span></div></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;">Timeout : 0 seconds</span></div></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;">BootOrder : 0000, 0001, 2001, 2002, 2003</span></div></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;"> Boot0000* FreeBSD HD(1,GPT,f859c46d-19ee-4e40-8975-3ad1ab00ac09,0x800,0x82000)/File(\EFI\freebsd\loader.efi)</span></div></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;"> nvd0p1:/EFI/freebsd/loader.efi /boot/efi//EFI/freebsd/loader.efi</span></div></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;"> HD(6,GPT,68f0614d-c322-11e9-857a-b1710dd81c0d,0x7bf1000,0x1577e000)/File(boot\kernel\kernel)</span></div></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;"> nvd0p6:boot/kernel/kernel /boot/kernel/kernel</span></div></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;">+Boot0001* Windows Boot Manager HD(1,GPT,f859c46d-19ee-4e40-8975-3ad1ab00ac09,0x800,0x82000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)</span></div></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;"> nvd0p1:/EFI/Microsoft/Boot/bootmgfw.efi /boot/efi//EFI/Microsoft/Boot/bootmgfw.efi</span></div></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;"> Boot2001* EFI USB Device </span></div></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;"> Boot2002* EFI DVD/CDROM </span></div></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;"> Boot2003* EFI Network </span></div></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;"><br /></span></div></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;"><br /></span></div></div></div><div style="text-align: left;"><div><div><span style="font-family: courier; font-size: xx-small;">Unreferenced Variables:</span></div></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: xx-small;">%</span></div></div></blockquote><div style="text-align: left;"><div><br /></div><div>Once this is in place, I needed to undo what I'd done to Windows:</div><div><br /></div></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;">%<span style="color: red;"> cd /boot/efi/EFI/Microsoft/Boot</span></span></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;">% <span style="color: red;">sudo mv bootmgfw-back.efi bootmgfw.efi</span></span></div></div><div style="text-align: left;"><div><span style="font-family: courier; font-size: x-small;">% </span></div></div></blockquote><div style="text-align: left;"><div><br /></div><div>I was then able to reboot to FreeBSD. And fun fact: since the boot order is 0000, 0001, that means I can boot to Windows by just typing 'quit' at the loader prompt. This causes the boot loader to exit with an error, which causes the BIOS to try the next BootXXXX variable, in this case windows.</div><div><br /></div><div>And there it is: I was able to recover my system without downloading a USB image...</div><div><br /></div></div><div style="text-align: left;"><br /></div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com1tag:blogger.com,1999:blog-32797070.post-31665477809690653682020-10-01T11:41:00.003-06:002020-10-06T21:32:36.357-06:00FreeBSD Subversion to Git Migration: Pt 2 Primer for Users<div id="doc" class="markdown-body container-fluid comment-inner comment-enabled" data-hard-breaks="true"><h1 id="FreeBSD-mini-git-Primer" data-id="FreeBSD-mini-git-Primer"><span>FreeBSD git Primer for Users</span></h1>
<p>Today's blog is actually a preview of a git primer I'm writing for the FreeBSD project. It covers what a typical user will need, including those relatively rare users that may have some changes to the base. Please let me know what you think, and ways it can be improved. I'm keen on especially clear and useful pointers for the topics as well.</p>
<p>Also note: The cgit-beta mirror mentioned below is currently for testing purposes only.</p>
<p>If you have a lot of suggests, you can make them directly on the original for this on <a href="https://hackmd.io/hJgnfzd5TMK-VHgUzshA2g?view">hackmd</a>.
<h2 id="Scope" data-id="Scope"><span>Scope</span></h2><p><span>If you want to download FreeBSD, compile it from sources and generally keep up to date that way, this primer is for you. If you are looking to do more with the tree, contribute back, or commit changes, then you will need to wait for a later blog where I cover that. It covers getting the sources, updating the sources, how to bisect and touches briefly on how to cope with a few local changes. It covers the basics, and tries to give good pointers to more in-depth treatment for when the readers finds the basics insufficient.</span></p><h2 id="Keeping-Current-With-FreeBSD-src-tree" data-id="Keeping-Current-With-FreeBSD-src-tree"><span>Keeping Current With FreeBSD src tree</span></h2><p><span>First step: cloning a tree. This downloads the entire tree. There’s two ways to download. Most people will want to do a deep clone of the repo. However, there are times that you may wish to do a shallow clone.</span></p><h3 id="Branch-names" data-id="Branch-names"><span>Branch names</span></h3><p><span>The branch names in the new git repo are similar to the old names. For the stable branches, they are stable/X where X is the major release (like 11 or 12). The main branch in the new repo is ‘main’. The main branch in the old github mirror is ‘master’. Both reflecting the defaults of git at the time they were created. The main/master branch is the default branch if you omit the ‘-b branch’ or ‘–branch branch’ options below.</span></p><h3 id="Repositories" data-id="Repositories"><span>Repositories</span></h3><p><span>At the moment, there’s two repositories. The hashes are different between them. The old github repo is similar to the new cgit repo. However, there are a large number of mistakes in the github repo that required us to regenerate the export when we migrated to having a git repo be the source of truth for the project.</span></p><p><span>The github repo is at </span><a href="https://github.com/freebsd/freebsd.git" target="_blank" rel="noopener"><span>https://github.com/freebsd/freebsd.git</span></a><br>
<span>The new cgit beta repo is at </span><a href="https://cgit-beta.freebsd.org/src.git" target="_blank" rel="noopener"><span>https://cgit-beta.freebsd.org/src.git</span></a><br>
<span>These will be $URL in the commands below.</span></p><p><span>Note: The project doesn’t use submodules as they are a poor fit for our workflows and development model. How we track changes in third-party applications is discussed elsewhere and generally of little concern to the casual user.</span></p><h3 id="Deep-Clone" data-id="Deep-Clone"><span>Deep Clone</span></h3><p><span>A deep clone pulls in the entire tree, as well as all the history and branches. It’s the easiest to do. It also allows you to use git’s worktree feature to have all your active branches checked out into separate directories but with only one copy of the repository.</span></p><pre><code>git clone $URL -b branch [dir]
</code></pre><p><span>is how you make a deep clone. ‘branch’ should be one of the branches listed in the previous section. It is optional if it is the main/master branch. dir is an optional directory to place it in (the default will be the name of the repo you are clone (freebsd or src)).</span></p><p><span>You’ll want a deep clone if you are interested in the history, plan on making local changes, or plan on working on more than one branch. It’s the easiest to keep up to date as well. If you are interested in the history, but are working with only one branch and are short on space, you can also use --single-branch to only download the one branch (though some merge commits will not reference the merged-from branch which may be important for some users who are interested in detailed versions of history).</span></p><h3 id="Shallow-Clone" data-id="Shallow-Clone"><span>Shallow Clone</span></h3><p><span>A shallow clone copies just the most current code, but none or little of the history. This can be useful when you need to build a specific revision of FreeBSD, or when you are just starting out and plan to track the tree more fully. You can also use it to limit history to only so many revisions.</span></p><pre><code>git clone -b branch --depth 1 $URL [dir]
</code></pre><p><span>This clones the repository, but only has the most recent version in the respository. The rest of the history is not downloaded. Should you change your mind later, you can do ‘git fetch --unshallow’ to get the old history.</span></p><h3 id="Building" data-id="Building"><span>Building</span></h3><p><span>Once you’ve downloaded, building is done as described in the handbook, eg:</span></p><pre><code>% cd src
% make buildworld
% make buildkernel
% make installkernel
% make installworld
</code></pre><p><span>so that won’t be coverd in depth here.</span></p><h3 id="Updating" data-id="Updating"><span>Updating</span></h3><p><span>To update both types of trees uses the same commands. This pulls in all the revisions since your last update.</span></p><pre><code>git pull --ff-only
</code></pre><p><span>will update the tree. In git, a ‘fast forward’ merge is one that only needs to set a new branch pointer and doesn’t need to re-create the commits. By always doing a ‘fast forward’ merge/pull, you’ll ensure that you have an identical copy of the FreeBSD tree. This will be important if you want to maintain local patches.</span></p><p><span>See below for how to manage local changes. The simplest is to use --autostash on the ‘git pull’ command, but more sophisticated options are available.</span></p><h2 id="Selecting-a-Specific-Version" data-id="Selecting-a-Specific-Version"><span>Selecting a Specific Version</span></h2><p><span>In git, the ‘git checkout’ command can not only checkout branches, but it can also checkout a specific version. Git’s versions are the long hashes rather than a sequential number. You saw them above in the conflict when it said it couldn’t apply “646e0f9cda11”.</span></p><p><span>When you checkout a specific version, just specify the hash you want on the command line (the git log command can help you decide which hash you might want):</span></p><pre><code>git checkout 08b8197a74
</code></pre><p><span>and you have that checked out.</span></p><p><span>However, as with many things git, it’s not so simple. You’ll be greeted with a message similar to the following:</span></p><pre><code>Note: checking out '08b8197a742a96964d2924391bf9fdfeb788865d'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at 08b8197a742a hook gpiokeys.4 to the build
</code></pre><p><span>where the last line is generated from the hash you are checking out and the first line of the commit message from that revision. Also, a word about hashes: they can be abbreviated. That’s why you’ll see them have different lengths in different commands or their outputs. These super long hashes are often unique after 6 or 10 characters, so git lets you abbreviate and is somewhat inconsistent about how it presents them to users.</span></p><h2 id="Bisecting" data-id="Bisecting"><span>Bisecting</span></h2><p><span>Sometimes, things go wrong. The last version worked, but the one you just updated to does not. A developer may ask to bisect the problem to track down which commit caused the regression.</span></p><p><span>If you’ve read the last section, you may be thinking to yourself “How the heck do I bisect with crazy version numbers like that?” then this section is for you. It’s also for you if you didn’t think that, but also want to bisect.</span></p><p><span>Fortunately, one uses the ‘git bisect’ command. Here’s a brief outline in how to use it. For more information, I’d suggest </span><a href="https://www.metaltoad.com/blog/beginners-guide-git-bisect-process-elimination" target="_blank" rel="noopener"><span>https://www.metaltoad.com/blog/beginners-guide-git-bisect-process-elimination</span></a><span> or </span><a href="https://git-scm.com/docs/git-bisect" target="_blank" rel="noopener"><span>https://git-scm.com/docs/git-bisect</span></a><span> for more details. The man page is good at describing what can go wrong, what to do when versions won’t build, when you want to use terms other than ‘good’ and ‘bad’, etc, none of which will be covered here.</span></p><p><span>‘git bisect start’ will start the bisection process. Next, you need to tell a range to go through. ‘git bisect good XXXXXX’ will tell it the working version and ‘git bisect bad XXXXX’ will tell it the bad version. The bad version will almost always be HEAD (a special tag for what you have checked out). The good version will be the last one you checked out.</span></p><p><span>A quick aside: if you want to know the last version you checked out, you should use ‘git reflog’:</span></p><pre><code>5ef0bd68b515 (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: pull --ff-only: Fast-forward
a8163e165c5b (upstream/master) HEAD@{1}: checkout: moving from b6fb97efb682994f59b21fe4efb3fcfc0e5b9eeb to master
...
</code></pre><p><span>shows me moving the working tree to the master branch (a816…) and then updating from upstream (to 5ef0…). In this case, bad would be HEAD (or 5rf0bd68) and good would be a8163e165. As you can see from the output, HEAD@{1} also often works, but isn’t foolproof if you’ve done other things to your git tree after updating, but before you discover the need to bisect.</span></p><p><span>Back to git bisect. Set the ‘good’ version first, then set the bad (though the order doesn’t matter). When you set the bad version, it will give you some statistics on the process:</span></p><pre><code>% git bisect start
% git bisect good a8163e165c5b
% git bisect bad HEAD
Bisecting: 1722 revisions left to test after this (roughly 11 steps)
[c427b3158fd8225f6afc09e7e6f62326f9e4de7e] Fixup r361997 by balancing parens. Duh.
</code></pre><p><span>You’d then build/install that version. If it’s good you’d type ‘git bisect good’ otherwise ‘git bisect bad’. You’ll get a similar message to the above each step. When you are done, report the bad version to the developer (or fix the bug yourself and send a patch). ‘git bisect reset’ will end the process and return you back to where you started (usually tip of main). Again, the git-bisect manual (linked above) is a good resource for when things go wrong or for unusual cases.</span></p><h2 id="Ports-Considerations" data-id="Ports-Considerations"><span>Ports Considerations</span></h2><p><span>The ports tree operates the same way. The branch names are different and the repos are in different locations.</span></p><p><span>The github mirror is at </span><a href="https://github.com/freebsd/freebsd-ports.git" target="_blank" rel="noopener"><span>https://github.com/freebsd/freebsd-ports.git</span></a><br>
<span>The cgit mirror is </span><a href="https://cgit-beta.freebsd.org/src.git" target="_blank" rel="noopener"><span>https://cgit-beta.freebsd.org/src.git</span></a></p><p><span>As with ports, the ‘current’ branches are ‘master’ and ‘main’ respectively. The quarterly branches are named the same as in FreeBSD’s svn repo.</span></p><h2 id="Coping-with-Local-Changes" data-id="Coping-with-Local-Changes"><span>Coping with Local Changes</span></h2><p><span>Here’s a small collections of topics that are more advanced for the user tracking FreeBSD. If you have no local changes, you can stop reading now (it’s the last section and OK to skip).</span></p><p><span>One item that’s important for all of them: all changes are local until pushed. Unlike svn, git uses a distributed model. For users, for most things, there’s very little difference. However, if you have local changes, you can use the same tool to manage them as you use to pull in changes from FreeBSD. All changes that you’ve not pushed are local and can easily be modified (git rebase, discussed below does this).</span></p><h3 id="Keeping-local-changes" data-id="Keeping-local-changes"><span>Keeping local changes</span></h3><p><span>The simplest way to keep local changes (especially trivial ones) is to use ‘git stash’. In its simples form, you use ‘git stash’ to record the changes (which pushes them onto the stash stack). Most people use this to save changes before updating the tree as described above. They then use ‘git stash apply’ to re-apply them to the tree. The stash is a stack of changes that can be examined with ‘git stash list’. The git-stash man page (</span><a href="https://git-scm.com/docs/git-stash" target="_blank" rel="noopener"><span>https://git-scm.com/docs/git-stash</span></a><span>) has all the details.</span></p><p><span>This method is suitable when you have tiny tweaks to the tree. When you have anything non trivial, you’ll likely be better off keeping a local branch and rebasing. It is also integreated with the ‘git pull’ command: just add ‘–autostash’ to the command line.</span></p><h3 id="Keeping-a-local-branch" data-id="Keeping-a-local-branch"><span>Keeping a local branch</span></h3><p><span>It’s much easier to keep a local branch with git than subversion. In subversion you need to merge the commit, and resolve the conflicts. This is managable, but can lead to a convoluted history that’s hard to upstream should that ever be necessary, or hard to replicate if you need to do so. Git also allows one to merge, along with the same problems. That’s one way to mange the branch, but it’s the least flexible.</span></p><p><span>Git has a concept of ‘rebasing’ which you can use to avoids these issues. The ‘git rebase’ command will basically replay all the commits relative to the parent branch at a newer location on that parent branch. This section will briefly cover how to do this, but will not cover all scenarios.</span></p><h4 id="Create-a-branch" data-id="Create-a-branch"><span>Create a branch</span></h4><p><span>Let’s say you want to make a hack to FreeBSD’s ls command to never, ever do color. There’s many reasons to do this, but this example will use that as a baseline. The FreeBSD ls command changes from time to time, and you’ll need to cope with those changes. Fortunately, with git rebase it usually is automatic.</span></p><pre><code>% cd src
% git checkout main
% git checkout -b no-color-ls
% cd bin/ls
% vi ls.c # hack the changes in
% git diff # check the changes
diff --git a/bin/ls/ls.c b/bin/ls/ls.c
index 7378268867ef..cfc3f4342531 100644
--- a/bin/ls/ls.c
+++ b/bin/ls/ls.c
@@ -66,6 +66,7 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#undef COLORLS
#ifdef COLORLS
#include <termcap.h>
#include <signal.h>
% # these look good, make the commit...
% git commit ls.c
</code></pre><p><span>The commit will pop you into an editor to describe what you’ve done. Once you enter that, you have your own </span><strong><span>local</span></strong><span> branch in the git repo. Build and install it like you normally would, following the directions in the handbook. git differs from other version control systems in that you have to tell it explicitly which files to use. I’ve opted to do it on the commit command line, but you can also do it with ‘git add’ which many of the more in depth tutorials cover.</span></p><h4 id="Time-to-update" data-id="Time-to-update"><span>Time to update</span></h4><p><span>When it’s time to bring in a new version, it’s almost the same as w/o the branches. You would update like you would above, but there’s one extra command before you update, and one after. The following assumes you are starting with an unmodified tree. It’s important to start rebasing operations with a clean tree (git usually requires this).</span></p><pre><code>% git checkout main
% git pull --no-ff
% git rebase -i main no-color-ls
</code></pre><p><span>This will bring up an editor that lists all the commits in it. For this example, don’t change it at all. This is typically what you are doing while updating the baseline (though you also use the git rebase command to curate the commits you have in the branch).</span></p><p><span>Once you’re done with the above, you’ve move the commits to ls.c forward from the old version of FreeBSD to the newer one.</span></p><p><span>Sometimes there’s merge conflicts. That’s OK. Don’t panic. You’d handle them the same as you would any other merge conflicts. To keep it simple, I’ll just describe a common issue you might see. A pointer to a more complete treatment can be found at the end of this section.</span></p><p><span>Let’s say the includes changes upstream in a radical shift to terminfo as well as a name change for the option. When you updated, you might see something like this:</span></p><pre><code>Auto-merging bin/ls/ls.c
CONFLICT (content): Merge conflict in bin/ls/ls.c
error: could not apply 646e0f9cda11... no color ls
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 646e0f9cda11... no color ls
</code></pre><p><span>which looks scary. If you bring up an editor, you’ll see it’s a typical 3-way merge conflict resolution that you may be familiar with from other source code systems (the rest of ls.c has been omitted):</span></p><pre><code><<<<<<< HEAD
#ifdef COLORLS_NEW
#include <terminfo.h>
=======
#undef COLORLS
#ifdef COLORLS
#include <termcap.h>
>>>>>>> 646e0f9cda11... no color ls
</code></pre><p><span>The new code is first, and your code is second. The right fix here is to just add a #undef COLORLS_NEW before #ifdef and then delete the old changes:</span></p><pre><code>#undef COLORLS_NEW
#ifdef COLORLS_NEW
#include <terminfo.h>
</code></pre><p><span>save the file. The rebase was interrupted, so you have to complete it:</span></p><pre><code>% git add ls.c
% git rebase --cont
</code></pre><p><span>which tells git that ls.c has changed and to continue the rebase operation. Since there was a conflict, you’ll get kicked into the editor to maybe update the commit message.</span></p><p><span>If you get stuck during the rebase, don’t panic. git rebase --abort will take you back to a clean slate. It’s important, though, to start with an unmodified tree.</span></p><p><span>For more on this topic, </span><a href="https://www.freecodecamp.org/news/the-ultimate-guide-to-git-merge-and-git-rebase/" target="_blank" rel="noopener"><span>https://www.freecodecamp.org/news/the-ultimate-guide-to-git-merge-and-git-rebase/</span></a><span> provides a rather extensive treatment. It goes into a lot of cases I didn’t cover here for simplicity that are useful to know since they come up from time to time.</span></p><h3 id="Updating-to-a-New-FreeBSD-Branch" data-id="Updating-to-a-New-FreeBSD-Branch"><span>Updating to a New FreeBSD Branch</span></h3><p><span>Let’s say you want to main the jump from FreeBSD stable/12 to FreeBSD current. That’s easy to do as well, if you have a deep clone.</span></p><pre><code>% git checkout main
% # build and install here...
</code></pre><p><span>and you are done. If you have a local branch, though, there’s one or two caveats. First, rebase will rewrite history, so you’ll likely want to do something to save it. Second, jumping branches tends to encounter more conflicts. If we pretend the example above was relative to stable/12, then to move to main, I’d suggest the following:</span></p><pre><code>% git checkout no-color-ls
% git checkout -b no-color-ls-stable-12 # create another name for this branch
% git rebase -i stable/12 no-color-ls --onto main
</code></pre><p><span>What the above does is checkout no-color-ls. Then create a new name for it (no-color-ls-stable-12) in case you need to get back to it. Then you rebase onto the main branch. This will find all the commits to the current no-color-ls branch (back to where it meets up with the stable/12 branch) and then it will replay them onto the main branch creating a new no-color-ls branch there (which is why I had you create a place holder name).</span></p></div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com2tag:blogger.com,1999:blog-32797070.post-77006184080624868692020-09-19T09:52:00.007-06:002020-10-06T21:32:18.689-06:00FreeBSD Subversion to Git Migration: Pt 1 Why?<h1 style="text-align: left;"> FreeBSD moving to Git: Why</h1><div>With luck, I'll be writing a few blogs on FreeBSD's move to git later this year. Today, we'll start with "why"?</div><h2 style="text-align: left;">Why?</h2><div>There's a number of factors motivating the change. We'll explore the reasons, from long term viability of Subversion, to wider support for tools that will make the project better. Today I'll enumerate these points. There are some logistical points around how the decision was made. I'll not get into the politics about how we got here, though. While interesting for insiders who like to argue and quibble, they are no more relevant to the larger community that the color of the delivery truck that delivered groceries to your grocer this morning (even if it had the latest episode of a cool, scrappy cartoon cat that was involved in a multi-year arc wooing the love of his life by buying food at this store).</div><div><br /></div><h3 style="text-align: left;">Apache has moved on, so has llvm</h3><div>The Apache Foundation used to be the care taker and main user for Subversion. They used Subversion for all their repos. While they still technically the caretaker of Subversion, they've moved all their repositories to git. This is a worrying development because the foreseeable outcome of this will be less Subversion development. This will mean the FreeBSD project will need to undertake to support Subversion if we remain on it in the long term. FreeBSD is now the last, large Open Source project using Subversion. LLVM has made its transition to git recently. There are very real concerns about the health and viability of the Subversion ecosystem, especially when compared to the thriving, vibrant git ecosystem.</div><div><br /></div><h3 style="text-align: left;">Better CI support</h3><div><div dir="auto">Git have more support for newer CI tools than subversion. This will allow us, once things are fully phased in, to increase the quality of the code going into the tree, as well as greatly reduce build breakages and accidental regressions. While one can use CI tools outside of git, integration into a git workflow requires less discipline on the part of developers, making it easy for them to fix issues found by CI as part of the commit/merge process before they affect others.</div><div dir="auto"><br /></div><h3 style="text-align: left;">Better Merging</h3><div dir="auto">Git merging facilities are much better than subversion. You can more easily curate patches as well since git supports a rebase workflow. This allows cleaner patches that are logical bits for larger submissions. Subversion can't do this.</div><div dir="auto"><br /></div><div dir="auto">Git also allows integration of multiple git repositories with subtree rewriting via 'git subtree merge'. This allows for easier tracking of upstream projects and will allow us to improve the vendor import work flow.</div><div dir="auto"><br /></div><h3 style="text-align: left;">Robust Mirroring</h3><div dir="auto">Git can easily and robustly be mirrored. Subversion can be mirrored, but that mirroring is far from robust. One of the snags in the git migration is that different svn mirrors have different data than the main repo or each other. Mirroring in git is built into the work flow. Since every repo is cloned, mirroring comes along for free. And there's a number of third party mirroring sites available, such as GitHub, GitLab and SourceForge. These sites offer collaboration and CI add ons as well.</div><div dir="auto"><br /></div><div dir="auto">Git can sign tags and commits. Subversion cannot. We can increase the integrity of the source of truth though these measures.</div><div dir="auto"><br /></div><h3 style="text-align: left;">Features from 3rd Party Sites</h3><div dir="auto">Mirroring also opens up more 3rd party plug ins. Gitlab can do some things, Github other things, in terms of automated testing and continuous integration. Tests can be run when branches are pushed. Both these platforms have significant collaboration tools as well, which will support groups going off and creating new features for FreeBSD. While one can use these things to a limited degree, with subversion mirrored to GitHub, the full power of these tools isn't fully realized without a conversion to git.</div><div dir="auto"><br /></div><div dir="auto">The wide range of tools available on these sites, or in stand-alone configurations, will allow us to have both pre-commit checks, as well as long-term post-commit tests running on a number of different platforms. This will allow the project to leverage existing infrastructure where it makes financial sense to let others run the tests, while still allowing the project to retain control of the bits that are critical to our operations.</div><div dir="auto"><br /></div><h3 style="text-align: left;">Improved User-Submitted Patch Tracking and Integration</h3><div>One area we've struggled with as a project is patch integration. We have no clear way to submit patches that will be acted on in a timely fashion, or at least that's the criticism. We do have ways, but they are only partially effective at integrating patches into the tree. Pull requests, of various flavors, offer a centralized way to accept patches, and have tools to review them. This should lower the friction to people submitting patches, as well as making it easier for developers to review the patches. Other projects have reported increased patch flow when moving to git. This can also be coupled with automated testing and other validation of the patch before the developer looks at it, which addresses one of the big issues with past systems: very low signal to noise ratio. While not a panacea, it will make things better and more widely use the scarce developer time.</div><div><br /></div><h3 style="text-align: left;">Collaboration</h3><div>Some have said that git, strictly speaking, isn't a pure source code management system. It is really a collaboration tool that also supports versioning. This may sound like a knock on git, but really it's git's greatest strength. Git's distributed model allows for easier and more frequent collaboration. Whole webs sites have been built around this concept, and show the power of easy collaboration to amplify efforts and build community.</div><div><br /></div><h3 style="text-align: left;">Skill Set</h3><div dir="auto">All of this is before the skill set arguments are made about kids today just knowing git, but needing to learn subversion. That has had increasing been a source of friction. This argument is supported both by anecdotal evidence of people complaining about having to learn Subversion, about professors having to take time to teach it, etc. In addition, studies in the industry have shown a migration to git away from other alternatives. Git now has between 80% and 90% of the market, depending on which data you look at. It's so widely used that our non-use of it is a source of friction for new developers.</div><div dir="auto"><br /></div><h3 style="text-align: left;">Developers are already moving</h3><div dir="auto">More and more of the active developers on the project use git for all or part of their development efforts. This has lead to a minor amount of friction because all these ways are not standardized, have fit and finish issues when pushing the changes into subversion, and cause friction. The friction is somewhat offset by the increase in productivity they offer these developers. The thinking is that having git as source of truth will unlock the potential of git even more to increase productivity.</div><div dir="auto"><br /></div><h3 style="text-align: left;">Downsides</h3><div>First, git has no keyword expansion support for implementing $FreeBSD$. While one can quibble over the git add-ins that do this sort of thing, the information added isn't nearly as useful as Subversions'. This will represent a loss. However, tagged keyword expansion has been going out of style for a long time. It used to be that source code control systems would embed the commit history in files committed, only to discover weird things happened when they were imported into other projects so the practice withered. We ran into a similar issue years ago with $Id$ and all the projects switched to $FooBSD$ instead. This was useful when source code tracking was weak and companies randomly imported versions: it told us what versions were there. Now, companies tend to do this with git, which has better tracking to the source abilities. The value isn't zero, but it's much lower than when we adopted it in the 90s. Git also doesn't support dealing with all the merge conflicts it causes very well. Since the tool rewards people for importing in a more proper way, more companies appear to be using it that way, lessening the need for explicit source marking. [edit: some don't consider this a loss at all].</div><div><br /></div><div>Second, git doesn't have a running count of commits. One can work around this in a number of ways, but there's nothing fundamental that can be used as a commit number as reliably as subversion. Even so, the workarounds suffice for most uses, and many projects are using git and commit counts successfully today.</div><div dir="auto"><br /></div></div><div dir="auto">Third, the BSDL git clients are much less mature than the GPL ones. Until recently, there was no C client that could be imported into the tree. While one might debate whether or not that's a good idea, there's a strong cultural heritage of having all you need in the base system that's hard to shrug off. OpenBSD recently wrote got which has an agreeable license (but a completely different command line interface, for good or ill). It has its issues, which aren't relevant here, but is maturing nicely. Even with the current restrictions, it is usable. There is an active port of got to FreeBSD due to the large number of OpenBSDisms that are baked in (some necessary, some gratuitous). The OpenBSD people are open to having a portable version of got, so this is encouraging.</div><div dir="auto"><br /></div><div dir="auto">Finally, Change Is HARD. It's easy to keep using the same tools, with the same work flows with with the same people as you did yesterday. Learning a new system is difficult. Migrating one work flow to another is tricky. You have to balance the accumulated knowledge and tooling benefits vs the cost it will take to move to something new. The git migration team views moving from subversion to git as the first step in many of improving and refining FreeBSD's work flow. As such, we've tried to create a git workflow that will be familiar to old users and developers, and at the same time allow for further innovation in the future.</div><div dir="auto"><br /></div><h3 style="text-align: left;">Conclusion</h3><div>Although it's not without risk and engineering trade offs, the bulk of the evidence strongly suggests that moving to git will increase our productivity, improve project participation, grow the community, increase quality and produce a better system in the end. It will give us a platform that we can also re-engineer other aspects of the project. This will come at the cost of retooling our release process, our source distribution infrastructure and developers needing to learn new tools. The cost will be worth it, as it will pay dividends for years to come.</div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com4tag:blogger.com,1999:blog-32797070.post-35025499473071359102020-08-31T15:50:00.003-06:002020-10-06T21:32:01.307-06:00How to transport a branch from one git tree to another<h1 style="text-align: left;">git branch transport</h1><div>Recently, I had need to move a branch from one repo to another.</div><div><br /></div><div>Normally, one would do a 'get push' or 'get fetch' to do this. It's fundamental to git. If you are looking for how to do this, you should see something else.</div><div><br /></div><div>So what abnormal thing am I doing?</div><div><br /></div><div>git svn.</div><div><br /></div><div>So I have two git svn trees. They both point to FreeBSD's upstream subversion repo. git svn is cool and all, but has some issues.</div><div><br /></div><div>First, it creates unique branches between the two trees. The git hashes are different. This makes it harder to move patches between trees. It's possible, but ugly (too ugly to document here).</div><div><br /></div><div>Second, sometimes (though rarely) git svn loses its mind. If it does this and you have a dozen branches in flight when it happens, what do you do?</div><div><br /></div><div>Third, git svn fetch, the first time, takes over a day. So recreating the tree isn't to be undertaken lightly.</div><h2 style="text-align: left;">How to export / import the branch</h2><div>Git has a nice feature to send mail to maintainers. You can take all the patches on a branch and email-bomb a mailing list. This is a direct result of the Linux (and friends) work flow. Leaving aside the wisdom of that work flow, git support for it is helpful. Because git also implements a 'hey, I was mail bombed, please sift through it and apply it to my tree' functionality. Between the two we have the makings for a solution to my problem.</div><div><br /></div><div>The 'export' side it 'git format-patch'. It normally exports it as a bunch of files. However the '--stdout' flag allows you to export it as a stream.</div><div><br /></div><div>The 'import' side is 'git am'. One could use 'git apply' but it requires you write a loop that 'git am' already does it.</div><div><br /></div><div>So, recently, when I had another instance of my every year or two 'git svn screwed the tree up' experience, I was able to transport my branches by putting these together and understanding a bit about what is going on with git.</div><h3 style="text-align: left;">The Hack</h3><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><span style="font-family: courier;">bad-tree% git format-patch --stdout main..foo | \</span></div><div><span style="font-family: courier;"> ssh remote "(cd some/path && git checkout main && \</span></div><div><span style="font-family: courier;"> git checkout -b foo && git am)"</span></div></blockquote><p>so that's it. We format the patches for everything from the mainline through the end of foo. It doesn't matter where 'foo' is off main. The main.. notation is such that it does the right thing (see gitrevisions(7) for all you could do here).</p><p>On the receiving side, we cd to git svn repo (or really any repo, this technique generalizes if you're moving patches between projects, though you may need to apply odd pipeline filters to change paths), make sure we have a clean tree with 'git checkout main' (though I suppose I could make that more robust). We create a new branch foo and then we apply the patch. Easy, simple, no muss, no fuss.</p><p>BTW I use '&&' above in case I've fat fingered anything, or there's already a foo branch, etc, it will fail as early as possible.</p><h3 style="text-align: left;">But what about when things go wrong...</h3><div>Well, things go wrong from time to time. Sadly, this blog doesn't have all the answers, but you'll basically have to slog through it manually. The few times it has happened to me, I've copied the patch over, and consulted <a href="https://git-scm.com/docs/git-am">git-am</a> to see how each of the weird things I hit had to be dealt with.</div><div><br /></div><div>'git am --show-current-patch' is the most helpful command I've found to deal with the occasional oops.</div><div><br /></div><div>I also have found that fewer patches on a branch I have to do this with, the more likely it will apply on the remote side.</div><h3 style="text-align: left;">One Last Hack</h3><div>So I was helping out with the OpenZFS merge and as part of that created a bunch of changes to the FreeBSD spl in OpenZFS. I did this the FreeBSD tree, but needed to then create a pull request. I used a variation of this technique to automate sending the branch from one place to another.</div><div><br /></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><span style="font-family: courier;">cd freebsd</span></div><div><span style="font-family: courier;">git format-patch --stdout main..zstd sys/contrib/openzfs | \</span></div><div><span style="font-family: courier;"> sed -e 's=/sys/contrib/openzfs/=/=g' | \</span></div><div><span style="font-family: courier;"> (cd ../zfs ; git checkout master && git branch -b zstd && \</span></div><div><span style="font-family: courier;"> git am)</span></div></blockquote><p>This nicely moved the patches from one tree to the other to make it easier for me to create my pull request. Your milage may vary, and I've had to play around with the filter to make sure I didn't catch unwanted things in it... I've not taken the time to create a regexp for the lines that I need to apply the sed to for maximum safety, but so far I've gotten lucky that the above path isn't an any of the files I want to transport this way...</p><h3 style="text-align: left;">Final Though</h3><div>One could likely also use subtree merging to accomplish this. I've had issues in the past, though, when there wasn't a common ancestor. Caveat Emptor. It's not the right tool for this problem, but it often is for related problems.</div><h3 style="text-align: left;">Postscript</h3><div>Git rebase was originally implemented this way, but with a -3 on the command line, which is quite handy.</div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com0tag:blogger.com,1999:blog-32797070.post-41349103635453328132020-08-16T17:56:00.005-06:002020-08-17T13:16:28.501-06:00A 35-year-old bug in patch found in efforts to restore 29 year old 2.11BSD<h1 style="text-align: left;"> A 35 Year Old Bug in Patch.</h1><div>Larry Wall posted patch 1.3 to mod.sources on May 8, 1985. A number of versions followed over the years. It's been a faithful alley for a long, long time. I've never had a problem with patch until I embarked on the 2.11BSD restoration project. In going over the logs very carefully, I've discovered a bug that bites this effort twice. It's quite interesting to use 27 year old patches to find this bug while restoring a 29 year old OS...</div><div><br /></div><div>After some careful research, this turned out to be a fairly obscure bug in an odd edge case caused by "the state of email in the 1980s." which can be relegated to the dustbin of history...</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7BUTYl0aQSxi41L-xhovecov6BUdtzU-skFs-6QvPWScKNimDRT3YGtn7C0vR2q0__mJy-Ei66eyi2hhBIcKkjWG4_OHA3_nabUxCkvmJaAEeZoQFvH6lyPYemKqmrbZzMRyE/s640/IMG_3914.jpeg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="640" data-original-width="480" height="328" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7BUTYl0aQSxi41L-xhovecov6BUdtzU-skFs-6QvPWScKNimDRT3YGtn7C0vR2q0__mJy-Ei66eyi2hhBIcKkjWG4_OHA3_nabUxCkvmJaAEeZoQFvH6lyPYemKqmrbZzMRyE/w246-h328/IMG_3914.jpeg" width="246" /></a></div><div><br /></div><h2 style="text-align: left;">What is the bug?</h2><div>Why has no-one else noticed this bug? Well, it only happens when we're processing the last patch hunk in a file, and that patch hunk only deletes lines and the 'new-style' context diff omits the replacement text (since it's implied). Oh, and you also have to be doing a -R patch as well? That's pretty obscure, eh?</div><div><br /></div><div>I found it with the following patch from the 2.11BSD series (patch 107). It ends like so:</div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="font-family: courier;">*** /usr/src/bin/sh/mac.h.old Fri Dec 24 18:44:31 1982</span></div></div><div><div><span style="font-family: courier;">--- /usr/src/bin/sh/mac.h Mon Jan 18 08:45:24 1993</span></div></div><div><div><span style="font-family: courier;">***************</span></div></div><div><div><span style="font-family: courier;">*** 59,63 ****</span></div></div><div><div><span style="font-family: courier;"> #define RQ '\''</span></div></div><div><div><span style="font-family: courier;"> #define MINUS '-'</span></div></div><div><div><span style="font-family: courier;"> #define COLON ':'</span></div></div><div><div><span style="font-family: courier;">-</span></div></div><div><div><span style="font-family: courier;">- #define MAX(a,b) ((a)>(b)?(a):(b))</span></div></div><div><div><span style="font-family: courier;">--- 59,61 ----</span></div></div></blockquote><div><br /></div><div>which seems fairly routine and pedestrian, no? However, this hunk runs afoul of a very old bug in the patch code when one tries to reverse apply (-R) it. I got the following output:</div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="font-family: courier;">--------------------------</span></div></div><div><div><span style="font-family: courier;">|*** /usr/src/bin/sh/mac.h.old Fri Dec 24 18:44:31 1982</span></div></div><div><div><span style="font-family: courier;">|--- /usr/src/bin/sh/mac.h Mon Jan 18 08:45:24 1993</span></div></div><div><div><span style="font-family: courier;">--------------------------</span></div></div><div><div><span style="font-family: courier;">Patching file usr/src/bin/sh/mac.h using Plan A...</span></div></div><div><div><span style="font-family: courier;">No such line 62 in input file, ignoring</span></div></div><div><div><span style="font-family: courier;">Hunk #1 succeeded at 53 with fuzz 1 (offset -6 lines).</span></div></div><div><div><span style="font-family: courier;">done</span></div></div></blockquote><p>Which looks odd. Why is it complaining about a line that isn't there? why did it misapply the patch 6 lines earlier? It thinks it succeeded, but really added back the MAX macro line too early.</p><h2 style="text-align: left;">Where is the bug?</h2><div>While debugging this, I quickly discovered that inverse patch file look weird (patch will generate it for you in the .rej file)</div><div><br /></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="font-family: courier;">***************</span></div></div><div><div><span style="font-family: courier;">*** 59,61 ****</span></div></div><div><div><span style="font-family: courier;"><br /></span></div></div><div><div><span style="font-family: courier;"><br /></span></div></div><div><div><span style="font-family: courier;"><br /></span></div></div><div><div><span style="font-family: courier;">--- 59,63 ----</span></div></div><div><div><span style="font-family: courier;"> #define RQ '\''</span></div></div><div><div><span style="font-family: courier;"> #define MINUS '-'</span></div></div><div><div><span style="font-family: courier;"> #define COLON ':'</span></div></div><div><div><span style="font-family: courier;">+</span></div></div><div><div><span style="font-family: courier;">+ #define MAX(a,b) ((a)>(b)?(a):(b))</span></div></div></blockquote><div><br /></div><div>Notice the blank lines, they will become important later. They shouldn't be there. The start of the patch should look like:</div><div><div><span style="font-family: courier;"><br class="Apple-interchange-newline" /></span></div></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="font-family: courier;">***************</span></div></div><div><div><span style="font-family: courier;">*** 59,61 ****</span></div></div><div><div><span style="font-family: courier;">--- 59,63 ----</span></div></div></blockquote><div><div></div></div><div><br /></div><div>with things snugged together. That's our first clue as to what's going wrong. Since this applies only to reverse patches, we need to make sure that <span style="font-family: courier;">pch_swap</span> is doing what it's supposed to be doing. It's the thing that touches the internal representation when the -R flag is given to 'rewrite' the normalized form of the patch.</div><div><br /></div><div>Setting breakpoints shows that <span style="font-family: courier;">pch_swap</span> is producing garbage out, because it's getting garbage in. for some reason, the 3 extra blank lines come into this routine for swapping. So it's not a bug in reversing patches. Which is good: this bug doesn't but if it isn't the last hunk in the patch file.</div><div><br /></div><div>So what is inserting those blank lines? A little debugging later, lands us on the following code (in FreeBSD, other implementations are similar) in <span style="font-family: courier;">another_hunk() </span>in pch.c:</div><div><div><span style="font-family: courier;"> len = pgets(true);</span></div><div><span style="font-family: courier;"> p_input_line++;</span></div><div><span style="font-family: courier;"> if (len == 0) {</span></div><div><span style="font-family: courier;"> if (p_max - p_end < 4) {</span></div><div><span style="font-family: courier;"> /* assume blank lines got chopped */</span></div><div><span style="font-family: courier;"> strlcpy(buf, " \n", buf_size);</span></div><div><span style="font-family: courier;"> } else {</span></div><div><span style="font-family: courier;"> if (repl_beginning && repl_could_be_missing) {</span></div><div><span style="font-family: courier;"> repl_missing = true;</span></div><div><span style="font-family: courier;"> goto hunk_done;</span></div><div><span style="font-family: courier;"><span style="white-space: pre;"> </span> }</span></div><div><span style="font-family: courier;"> fatal("unexpected end of file in patch\n");</span></div><div><span style="font-family: courier;"> }</span></div><div><span style="font-family: courier;"> }</span></div></div><div>This is a little hard to follow, but it basically says that if pgets() returns 0 (which it does at the end of the file), then we try to bail out. If p_max - p_end < 4, it will insert a blank line. Otherwise, it will assume the replacement text is missing if we've started looking at the replacement and it could be missing. Fairly straight forward.</div><div><br /></div><div>p_max gets set to the largest possible extent of the patch in other code in <span style="font-family: courier;">another_hunk()</span><span style="font-family: inherit;"> when the "--- 59,61 ---" line is parsed in the original patch. In this case, p_max is 9 and p_end is 6 (it's set to p_end + 61 - 59 + 1). For normal diffs, we'd expect there to be an additional 3 lines of context here. But we don't have that with this diff since they are omitted.</span></div><div><span style="font-family: inherit;"><br /></span></div><div><span style="font-family: inherit;">So why '4' in the second 'if' in the quoted code above? what's so magic about it? Indeed, if we hack the patch to have 6 lines of context instead of 3, it applies correctly. So what gives? If we remove that entire if, the patch applies correctly as well. So that's a possible fix, but what are we losing by doing this?</span></div><h2 style="text-align: left;"><span style="font-family: inherit;">The Fix</span></h2><div><span style="font-family: inherit;">As noted, if we just remove the second if entirely and replace it with the lines from the 'else' clause, the patch applies. Now I need to justify just removing the if. An alternate fix would be to say if p_end != repl_beginning apply the </span>heuristic<span style="font-family: inherit;">, but otherwise don't. However, I think that fix is worse because the whole if isn't needed.</span></div><div><span style="font-family: inherit;"><br /></span></div><div><span style="font-family: inherit;">The oldest patch version I can find is patch 1.3 which Larry Wall posted May 8, 1985 to mod.sources in the old USENET hierarchy (well, I guess it's all old now, so maybe the pre-reorg </span>hierarchy). The SCCS comments in the file suggest it was started around Christmas the prior year, but I can't find any of those versions extant. The code is clearly there:</div><div><div><span style="font-family: courier; font-size: small;"> ret = pgets(buf,sizeof buf, pfp);</span></div><div><span style="font-family: courier; font-size: small;"> if (ret == Nullch) {</span></div><div><span style="font-family: courier; font-size: small;"> if (p_max - p_end < 4)</span></div><div><span style="font-family: courier; font-size: small;"> Strcpy(buf," \n"); /* assume blank lines got chopped */</span></div><div><span style="font-family: courier; font-size: small;"> else</span></div><div><span style="font-family: courier; font-size: small;"> fatal("Unexpected end of file in patch.\n");</span></div><div><span style="font-family: courier; font-size: small;"> }</span></div></div><div>though I don't think that the bug actually bit that version since it didn't try to fill in the blanks. The 2.0 version, released on Oct 27, 1986 does have code very similar to the code we use today:</div><div><div><span style="font-family: courier; font-size: small;"> ret = pgets(buf, sizeof buf, pfp);</span></div><div><span style="font-family: courier; font-size: small;"> if (ret == Nullch) {</span></div><div><span style="font-family: courier; font-size: small;"> if (p_max - p_end < 4)</span></div><div><span style="font-family: courier; font-size: small;"> Strcpy(buf, " \n"); /* assume blank lines got chopped */</span></div><div><span style="font-family: courier; font-size: small;"> else {</span></div><div><span style="font-family: courier; font-size: small;"> if (repl_beginning && repl_could_be_missing) {</span></div><div><span style="font-family: courier; font-size: small;"> <span style="white-space: pre;"> </span> repl_missing = TRUE;</span></div><div><span style="font-family: courier; font-size: small;"> goto hunk_done;</span></div><div><span style="font-family: courier; font-size: small;"> }</span></div><div><span style="font-family: courier; font-size: small;"> fatal1("Unexpected end of file in patch.\n");</span></div><div><span style="font-family: courier; font-size: small;"> }</span></div><div><span style="font-family: courier; font-size: small;"> }</span></div></div><div>which has this bug for the same reason modern code has this bug...</div><div><br /></div><div>So 'assume blank lines got chopped' is really only relevant to other types of patches (old-style context diffs I believe). One could also perhaps fix this only for old-style context and normal diffs. However, I think that's the wrong fix too. It's one of many patches that deals with 'diff going from A to B gets distorted in some predictable ways' that we no longer have to deal with.</div><div><br /></div><div>So why was the code added? I've sent an email to Larry Wall, but I've not heard back from him (he's gone onto perl fame, and doesn't usually mess with patch issues since maybe 1990, so I'm not hopeful of a reply from him). Absent that, though, I can relate my limited experiences of USENET in the late 1980s that are likely relevant. Email was viewed by many authors as a way to get text from point A to point B over very expensive date links, sometimes. As such, there was little compunction for making minor edits to the email that was sent to facilitate these goals. The 'shar' programs of the era recognized this problem and pre-pended X to all the lines in files that were run through them. A common issue was leading white space being deleted, and this solved that. Other issues with mailers, and mail software, included white space being inserted at the start of every line for replies. patch(1) itself deals with this case by trying to adjust for indented patch files by removing just enough leading white space to dig the applicable part of the diff out of these distorting influences. The notion of fuzz and other heuristics in patch cope, in part, with these difficulties. It's small wonder that in addition to all these issues, it coped with a few lines of trailing white space being deleted, corrupting the patch.</div><div><br /></div><div>We no longer live in a world where patches are subjected to such hostile conditions. Rather than tweak this heuristic designed to cope with BITNET, UUCP, SMTP, VMS, VM and any number of other mailers in the wild to deal with my case, I would suggest that we should delete the heuristic as no longer relevant. Patch files no longer are subject to this level of mischief. And if they are, adding a few blank lines to the end of patch that's corrupt seems like a much smaller universe of issues than having basic functionality broken. This runs the risk of breaking no, well-formed patches. The new-style context diffs that are padded ignore this padding. unified diffs and other variants patch supports doesn't need this padding and will ignore it. 'ed' scripts don't take this code path. 'old' style context diffs are a extremely rare bird these days.</div><h3 style="text-align: left;">Side note: Old Style Context Diffs</h3><div>So what program produced the "so called" old-style context diffs? The earliest diff I could find that produced context diffs was in 4.0BSD. The patch program looks for "*** XX,YY" for old style, but "*** XX,YY ***" for new. Looking at 4BSD sources, we see that they produce the former style. Releases through 4.2 included this style. Starting with release 4.3BSD, the new style was produced. So any system that was 4.2BSD based had the old style, and everything since 4.3BSD has had the new style (including gnu diff, which never produced the old style that I can tell). All diff programs since then have produced new-style context diffs (or the newer unified diffs that are even shorter). 4.3BSD was released in 1986, after the first release of patch, but before 2.0 which accounts for its understanding both variants.</div><h2 style="text-align: left;">FreeBSD Fix</h2><div>I've committed the fix for FreeBSD <a href="https://svnweb.freebsd.org/changeset/base/364291">here</a>. It should be trivial to adopt for other versions of patch that I've reviewed.</div><h2 style="text-align: left;">Conclusion</h2><div>So, a minor glitch I'd noticed in my reconstruction of 2.11BSD as released lead me to find a bug in patch that's been in the code for 35 years (and been a bug at least 34 of those years). The bug is an extreme edge case that triggers a heuristic for deleted trailing blank lines that in turn causes a problem reversing the patch, but only when it's the last one at the end of a patch file and only if it just deletes lines. Still, it's been rare that I've found and fixed bugs in my career that are 35 years old that I thought I'd write this up. It's also nuts that I found this using 27 year old patches...</div><h2 style="text-align: left;">Addendem</h2><div>On hacker news, I see that modern gnu-patch doesn't suffer from this issue. It would appear that gnu-patch had corrected this some time ago. I was looking at an old version when I thought that it hadn't fixed it...</div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com0tag:blogger.com,1999:blog-32797070.post-25543504051056670372020-08-06T11:56:00.000-06:002020-08-06T11:56:48.626-06:00Recovering 2.11BSD, fighting the patches<h1 style="text-align: left;">Recovering 2.11BSD, fighting the patches</h1><div>2.11BSD was released March 14, 1991 to celebrate the 30th anniversary of the PDP-11. It was released 15 months after 2.10.1BSD was released in January 1989.</div><div><br /></div><div>2.11BSD was quite the ambitious release. The high points include:</div><div><ol style="text-align: left;"><li>The kernel logger (/dev/klog)</li><li>The namei cache and argument encapsulation calling sequence</li><li>readv(2)/writev(2) as system calls rather than emulation/compatibility routines</li><li>Shadow password file implementation (the May 1989 4.3BSD update)</li><li>A TMSCP (TK50/TU81) driver with standalone support (bootblock and standalone driver)</li><li>Pronet and LH/DH IMP networking support</li><li>The portable ascii archive file format (ar, ranlib)</li><li>The Unibus Mapping Register (UMR) handling of the network was rewritten to avoid allocating excessive UMRs.</li><li>The necessary mods to the IP portion of the networking were made to allow traceroute (which is present in 2.11BSD) to run.</li><li>Long filenames in the file system</li></ol><div>In addition to a completely new syscall setup. Item 10 required a full new install with restoring from a back up tape. Item #7 would be a thorn in my side.</div></div><div><br /></div><div>However, following on the heels of 2.10.1BSD as quickly as it did, there's a number of changes that followed quickly after the release. So, by November of 1994 195 patches had been released for the tree. Well, there were more patches than that (patches 2 and 3 had several parts, and my work has uncovered a number of hidden patches along the way, but more about those later).</div><h2 style="text-align: left;">The Problem(s)</h2><div>Well, if we have patch 195, and all 195 patches, what's the problem? Why can't you do a simple for loop and patch -R to get back to original? And for that matter, why were no copies of the original saved?</div><div><br /></div><div>Turns out the root of both of these problems can be summarized as 'resource shortage'. Back in the day when this was released, 100MB disks were large. The release came on 2 mag tapes that held 40MB each. Saving a copy of these required a substantial amount of space. And it was more important to have the latest release, not the original release, for running the system. It was more efficient and better anyway.</div><div><br /></div><div>In addition to small disk space, these small systems were connected via USENET or UUCP. These connections tended to be slow. Coupled with the small size of the storage on the PDP-11s running 2.11BSD, the patches weren't what we think of as modern patches. The patches started before the newer unified diff format was created. That format is much more efficient that the traditional context diffs. In addition, compress(1) was the only thing that could compress things, giving poor compression ratios. The UUCP transport of usenet messages also mean that the messages had to be relatively short. So, this mean that the 'patches' were really an upgrade process, that often included patches. But just as often, it included instructions like this from patch 4:</div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><font face="courier" size="2">Fix:</font></div></div><div><div><font face="courier" size="2"> Apply the patch "/tmp/dif" (multiple files updated by it) and</font></div></div><div><div><font face="courier" size="2"> install the new scripts ":splfix.mfps" and "splfix.movb+mfps".</font></div></div></blockquote><div>which included a shar file that needed to be run through /bin/sh (or unshar, if you were lucky). You then needed to follow the instructions, which included patching. Patch 14 illustrates the problem, it includes the instructions that say to run /tmp/c created by the shar. It looks like this:</div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><font face="courier">#! /bin/sh -v</font></div></div><div><div><font face="courier">cd /usr/src/usr.bin</font></div></div><div><div><font face="courier">rm lint/*</font></div></div><div><div><font face="courier">zcat PORT/lint.tar.Z | tar xf -</font></div></div><div><div><font face="courier">cd lint</font></div></div><div><div><font face="courier">rm :yyfix llib-*</font></div></div><div><div><font face="courier">cp -p /tmp/libs libs</font></div></div></blockquote><div>So this is a very efficient way to remove files. Often the diffs were larger than the original files, so it was more efficient to remove and replace. But this presents two problems: what files were there before? And even in this case, what files were removed? These operations were not uncommon, and destroyed information. It's a bit like running the sausage mill backwards to rebuild the pig.</div><div><br /></div><div>Another problem for this project is phantom patches in the first 80 patches. A number of changes appear only in the patches that come with the catch-up kit. These aren't a surprise, as a number of patches going backwards had unexpected slight line number anomalies in them. After patch 80, patch generation appears to be better managed, but at the time of this writing, the author hasn't tried to reapply all the patches to get back to the p195 tape from the reconstructed release tape. The author also has not audited the comp.bugs.2bsd mailing list between the March 1991 release and the November 1994 p195 tape. Given the surprises so far (tftp and tftpd were updated in May 1991, patches were posted in comp.bugs.2bsd, but no formal patch was released and this change does appear in the catch-up patches), additional discoveries like this cannot be ruled out.</div><h2 style="text-align: left;">The Path Forward</h2><div>Taken at face value it's hopeless. There's no way to definitively reconstruct the lost information. But there's some glimmers of home. First, there weren't a lot of files deleted like this. lint, pcc, ld, ranlib and a few others were removed. However, what's missing can be rather critical. Next, we have both the prior release (2.10.1BSD). A good first approximation of what is there in the release will be what's in the last release. Many files aren't changed often in the 2BSD. So we have some data present there, even if some was destroyed.</div><div><br /></div><div>There were also a number of patches. These can provide data about the missing files. There's all the patches in the 2.11BSD series, as well as a number of patches posted to comp.bugs.2bsd after 2.10.1BSD was released. We know from the release notes that these were included in the 2.11BSD release.</div><div><br /></div><div>Next, we have 4.2BSD, 4.3BSD and even 4.4BSD and the SCCS files that go along with them. This means that we can see changes that were going on in the 4BSD series, and we know much code came from there in 2.11BSD, both before and after the release.</div><div><br /></div><div>Next, we have dates. We are fortunate that all the files are dated in the tree. This means we have a way of testing if we've missed anything in our reconstruction. If we reconstruct something that's dated after the release of 2.11BSD, we have a very good reason to believe that we've missed something.</div><div><br /></div><div>There was a catch-up kit that was produced around patch 80. It contained a number of commands to re-removed what should have been removed, as well patch everything up. This gives us a second way of checking: can we apply this kit to get to patch 80? Does it work? And if we replay the individual patches we should get the same thing. And it should be the same as we got unapplying the patches back from 195. A word of caution: as with all other things around this project, we must always be open to the possibility of a mistake in the catch-up kit. There are at least a few files that it tries to remove that aren't necessarily there.</div><div><br /></div><div>Finally, we know that the system was released as binaries. Which means that the system built. So we can test the reconstruction by compiling it. We should be able to build the final system. But we need to do that with the final system, so some way must be found to bootstrap it for this test. I'll talk more about that in another blog.</div><h2 style="text-align: left;">The Slog Backward</h2><div>The slog backwards proceeded with fits and starts. For the first 20 or so patches (that is patch 177-195), it was fairly straight forward. I was able to use them to develop the framework to proceed. It wasn't until I hit the a.out binary format changes that I had problems (the first, looking back, of these is 176).</div><h3 style="text-align: left;">The Framework</h3><div>I settled on a fairly simple framework going backwards. There are three types of patches in the archive. First, there are the pure patches. These have a simple patch set to apply, and maybe some verbal description of commands to run. Often, these commands were just the minimal amount to rebuild so you didn't have to suffer through a day's long compile. Sometimes, they included sneaky instructions. The patches 89-99 all contain the following text:</div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><div style="text-align: left;"><font face="courier">The /GENALLSYS script is obsolete and has been removed</font></div></blockquote><div>so in addition to applying the patches, the script needed to be removed. To complicate things, some patches were generated from the root directory, while others were generated in the leaf node. To this end when the script detects a simple patch it tries to locate a hints/patch#.setup script. If one is found, then that script is sourced. Setup scripts are expected to be idempotent so we can reuse them for the forward trip. They all do a cd to where the patch was generated from. After the setup, if any, the mk211bsd script will apply the patch.</div><div><br /></div><div>However, when there's other things to do, that won't work. So, there's a second way to assist. If there's a hints/patch#.unpatch, then that will be run and it is responsible for moving the patch backwards. About 20 patches need this assistance. For example, patch 118 replaces ucb/Mail with a port from 4.3. So, I need to reconstruct what was there. In this case, I copy the ucb/Mail files from 2.10.1 and then check for patches in comp.bugs.2bsd (there aren't any) and in the patch stream (patch 10 tweaks it). So, I have to reapply all those patches in the unpatch script.</div><div><br /></div><div>The second type of file is the shar file. Here, one has to run the shar file through /bin/sh (or unshar) and use the extracted files to do something. Often times there's a short script to run and a patch to apply, but other times it's more complicated. In these cases, you must provide an hints/patch#.unshar file. This file takes care of unsharing things, and running whatever you need to do to unapply it. This varies a lot. In some cases, you extract a patch (or set of patches) and reverse apply them. In other cases, you need to remove files. In still others you need to snag them from 2.10.1 and touch them up (like we did for ucb/Mail).</div><div><br /></div><div>The final type is a tar ball. These files are treated like patches, with the usual unpatch protocol. However, the unpatch program script has to know how the tar file encoded its patches.</div><h3 style="text-align: left;">Interesting Patches</h3><div>There's 195 patches (and a few sub-patches). Describing all of them would be quite tedious. Only about 80 hints are needed (and a few additional files for reconstructed fixups). I'll describe some of the more interesting ones briefly here. Most of the interesting ones are in the last 50 or so. And by interesting, I mean ones that destroyed information such that it had to be reconstructed or that otherwise affected the reconstruction.</div><div><br /></div><div>Patch 185 replaces m4, so we have to snag the one from 2.10.1BSD to replace it, as well as unapply a patch in the shar file. Patch 115 did a fixup on the Makefile, so we have to reapply it so that patch 115 will unapply correctly.</div><div><br /></div><div>Patch 184 fixes the makefiles to use pipelines instead of temporary files now that the assembler can cope with pipelines. At the same time, it removed a few obsolete compatibility system calls that need to be added back from 2.10.1BSD. Adding them back messes up the directory times, which make depends on, so workarounds have to be deployed in build2.sh, the bootstrap script (make in 2.11BSD assumes times in the future mean the directory is up to date and doesn't need to be rebuilt, while newer makes will ignore that time and descend into the directory always).</div><div><br /></div><div>Patch 180 updates symcompact.c and strcompact.c by replacing them entirely. These files weren't in 2.10.1BSD, but came in with patch 172, so needed to be recovered from there. It also adds symdump.c which needs to be removed. There's no data loss here, but it illustrates the need to look at all the patches to see what might need to be recovered (and what doesn't).</div><div><br /></div><div>Patch 178 removes an unused header, and fixes up another one. The headers were resynchronized in patch 175, so a small fixup is needed here. Need to investigate this, and other 'fixup' patches. One unknown is whether 2.11BSD shipped with the unsynchronized /usr/include and /usr/src/include or not. The reconstruction tries to get the right ones in each place, but uses the /usr/include ones as the ones in /usr/src/include when we can't otherwise reconstruct.</div><div><br /></div><div>Patches 158-176 remove the 8 character limit to symbol names in programs. These are quite disruptive, but for the most part just large patches. ranlib(1) was grabbed from 2.10.1 and patched to cope with the new archive format to undo these patches. ld(1) needed similar work (and once I started rebuilding things, I had to fix so it would compile). It also needed some fixes from comp.bugs.2bsd. Initially, I'd kept them separate, but I eventually needed to merge them together. ranlib(1) and ld(1) represent the largest effort in retro-programming to reconstruct (code was cut and pasted from other programs that survived and minimally changed to be functionally correct).</div><div><br /></div><div>Patches 151 and 152 rework the assembler. A number of patches to as were posted to comp.bugs.2bsd that needed to be applied to 2.10.1's assembler to make things work out. A couple of minor tweaks were needed after all these changes were applied, though, to make the patches work out.</div><div><br /></div><div>Patch 142 unapplied the patch, but then needs to unapply changes to all the kernel config files. This a recurring issue for the generated files, so some fancy scripting is needed to apply them to all the kernel config directories. Patches 124, 121, 93 (which has to remove some directories), 84, 83, 72, 42, 36, 4, and 2. There's a number of issues with patching the kernel, not least was that overlay structures were often hacked on the fly and preserving them is hard. The restoration has only tried to get GENERIC and possibly KAZOO kernel configs correct, and the others it has largely ignored. I'll do a full blog on all the issues to detail what is or isn't recovered.</div><div><br /></div><div>Patch 132 brings in named, so it needed to be recovered from 2.10.1, plus patches from patch 106.</div><div><br /></div><div>Patch 123 is actually missing a part. It updates the documentation for how to install the system. This means we need to apply some kind if fixup. But all we know for sure is the SCCS id changed, so that's all we fix up. If I find more data to support other changes, I'll update to include that, but so far nothing has surfaced.</div><div><br /></div><div>Patch 118 replaces ucb/Mail with the one from 4.3BSD. Revert to 2.10.1BSD's version and apply a patch from patch 10. There's no publicly posted patches to 2.10.1BSD for ucb/Mail.</div><div><br /></div><div>Patch 80 is the catch-up kit patch. A lot of files were added from USENET. Undoing it is straight forward, making it go forward will tough, but we have the files at least. This is both a blessing and a curse to the project. On the one hand, we have a second way of cross checking things. On the other, the cross checks reveal many problems, including updated kermit being missing entirely (though, to be fair, /usr/src/new and /usr/src/local weren't considered part of the system until patch 195, so prior to that patches to this part of the tree were irregular).</div><div><br /></div><div>Patch 40 is an announcement of corrupt files in the original release in /usr/games. I've chosen to restore them to what was intended for the original tape.</div><div><br /></div><div>Patch 17 massively reworked pcc. It's not quite right in the reconstruction yet, however, since the 'redo catch-up kit' test fails to delete some expected files, what shipped in 2.11BSD isn't quite right. It may never be right, and that may not matter since it didn't work anyway.</div><div><br /></div><div>Patch 14 fixes lint. It was totally broken in 2.11 (but worked in 2.10.1). Undoing it may also be incorrect for a similar reason as patch 17. Since neither one of these worked, it may be quite hard to know what 2.11 shipped with. A case could be made, though, that it doesn't matter...</div><div><br /></div><div>Patch 2 removed tmscpboot.s. The rest of the patch undoes easily, but tmscpboot.s was new in 2.11BSD. We know it is derived from tkboot.s which comes from Ultrix-11, but I've not yet been able to tweak it to work yet...</div><h2 style="text-align: left;">Current Status</h2><div>At this point, I've reconstructed a possible release tape. A series of them, actually. All of them fail the tests set forth above (though in fewer and fewer ways each iteration). I'm able to use the different tests to suggest fixes. I've recovered 5 lost patches (which I write about elsewhere). There's at least 5 more I believe based on the attempts to apply the catch-up kit. I discovered the first 5 based entirely on bad dates. The current reconstruction is decent (maybe 30-40 files still aren't quiet right, and a similar number are reconstructions that work, but it's impossible to know if they are missing bug fixes). The tmscpboot stuff is still missing, and there's a number of minor fixups that need to be reconciled with the known missing patches. All very careful, detailed work, so it may be some time to work through them.</div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com0tag:blogger.com,1999:blog-32797070.post-43055999926310681542020-08-04T09:41:00.000-06:002020-08-04T09:41:03.562-06:00Bootstrapping 2.11BSD (no patches) from 2.11BSD pl 195<h1 style="text-align: left;">Bootstrapping 2.11BSD (original)</h1><div>I've had the sources for what I think is the original 2.11BSD for some time now. However, how do I know these sources are good? That's a very good question. I have a series of tests that I'm doing to verify that the sources are consistent with what we know, or have some kind of known deviation / reconstruction when not. They had passed only the first of my many tests (they were consistent with the patches themselves, but nothing else). It was time to see if I could build what I'd made.</div><div><img alt="Click to close image, click and drag to move. Use arrow keys for next and previous." height="197" src="https://i.pinimg.com/564x/3d/5f/d9/3d5fd901932357dc985717be1d1be23f.jpg" width="205" /></div><div><br /></div><div>One thing we know for sure: The 2.11BSD release happened. This means that sources for the release must be buildable, in some way. The <a href="https://github.com/bsdimp/mk211bsd/blob/master/2.11BSD-ANNOUNCE">2.11 BSD release notes </a>don't mention any reproducibility issues. Presumably the documented way will work. However patches 106-111 fix dozens of build issues that affected reproducibility of the build. In addition, one should be able to build twice in a row and get identical results, modulo a few binaries that encode dates and such. Experience has shown that many programs in /usr/local or /usr/new are the worst offenders. I've made the decision that if make install doesn't install it from the top level, then it won't be in the release I recreate. Though I also made the decision that building some man pages by hand was also OK to make that happen...</div><div><br /></div><div>Part of building it twice is building it at all. In patches 158-178, the binary format of the .o files changes to accommodate longer symbol names. As a result, the binaries in the 195 image don't produce binaries that work on the unpatched release (well, the binaries themselves do, but the .o's are wrong, as are all programs that read symbols). In addition, there's issues just building everything on the 195 image: as, nm, and ld don't even build, and without those, you won't get far. In fact, the 195 assembler won't even assemble the assembler I've recreated. Since the straight forward way won't work, I thought I'd document what does.</div><div><br /></div><div>For a background on the toolchains, please see an <a href="http://bsdimp.blogspot.com/2020/07/traditional-unix-toolchains.html">earlier blog post</a>. It goes over all the basics of toolchains, which I assume people are familiar with.</div><h2 style="text-align: left;">Bootstrapping as</h2><div>So, we have to bootstrap the assembler. The 2.11pl195 assembler won't assemble it properly. The v7 assembler will. However, building it on a v7 system isn't the solution: the resulting binaries won't run on the 2.11BSD system. The system call format changed with 2.11BSD, so even the 2.10BSD binaries won't run. One advantage, though, of either the 2.11BSD or the V7 assembler is that it will run under apout.</div><div><br /></div><div>Apout is a tool that the unix-1972 crowd over at tuhs created to run PDP-11 binaries on modern hardware. It doesn't implement all the system calls. The C compiler which forks other things won't run, for example. However, the assembler will. And the loader. And cpp. Why's the last one important? Well, if we have cpp, then we can assemble the 2.11BSD system call glue in libc.</div><div><br /></div><div>The assembler is written in fairly low-level code. It calls half a dozen system calls, so this is easy, right? For the system calls, one needed only cpp and the assembler to create them. However, there's one other function it calls: signal. Signal used to be a system call when as was written. In 2BSD, Berkeley reworked how signals worked, so they created a compatibility shim written in C for the old way. That presents a problem... Getting the C compiler going was a lot of effort because it was so many passes and I'd have to string them all together by hand. My solution was to look at the sources and notice that it was just called to register an atexit function to cleanup tmp files when SIGINT was received. This is important for real, old-school PDP-11 hardware that measured the speed in hundreds of thousands of operations a second (or worse!). It would mean that ^C would clean up the temp files. But for bootstrapping? It's not really needed. So I created a .s file that was just '_signal: rts pc', which does nothing but satisfy linkage...</div><div><br /></div><div>To make things simple, I used ld's partial link functionality to link all the .o's together to create a bootstrap.o. This took the place of libc. So I was able to bootstrap the assembler using the V7 as and ld binaries as well as the 2.11BSD cpp binary to pre-process the 2.11 sources. I did this twice, once for each pass of the assembler. I added the code to the script that I use to create the 2.11BSD (original) tree. This script took care of copying the results into the 2.11BSD tree. It was able to assemble itself, so on to the next step.</div><div><br /></div><div>Now that I had the assembler bootstrapped, I could move on to the next things. Here we shift from the FreeBSD host that was creating the 2.11BSD (original) tree to a 2.11BSD pl 195 simh image that had a copy of this tree (which I'll call ur2.11 below to distinguish it from 2.11BSD pl 195 which I'll just call '195 below) mounted on /scratch. FYI: the 'ur' prefix means 'original' and it's often used in linguistics to describe the original version of something, now lost but reconstructed.</div><h2 style="text-align: left;">Bootstrapping ranlib (and to get there ld and nm)</h2><div>So, one of the things you need is something called ranlib. It reads through a library and collects a table of all the symbols in that library and puts it in the first member of that archive. ld then uses that to pull in what it needs from the library. This eliminates the need to worry about cycles and other strange things. Normally, without a table of contents, ld will just make a single pass through the .a file, pulling in everything that's needed. When there's no cycles in the dependencies, this works great when you create the library with 'lorder *.o | tsort' so that it can be pulled in with one pass. If there are cycles, the library has to be pulled in multiple times to resolve them all.</div><div><br /></div><div>libc, of course, has cycles. So, how do we fix that? Well, we need to build ranlib (since the newer ranlib uses a different table of contents format, because why would it be easy). To make matters worse, 2.11BSD changed the archive format to the portable archive format from the old PDP-11 format.</div><div><br /></div><div>So, to build ranlib, we need libc and ld. For libc, we need nm because the lorder shell script uses it and I didn't want to hack the build process. Let's focus on the first two of those. In an ideal world, we could just build them on the '195 image. For once in this project, that's entirely possible, but with a caveat. The include files have changed, so I needed to build this on the 195 system, but using the ur2.11 includes (not the '195 ones, they had been rototilled in the 158-178 patch sequence for the new binary format). I needed to do this in the '195 system because it could create new binaries (but chrooted to the ur2.11 system could not). I was able to do this simply enough:</div><blockquote><div><font face="courier">cd /scratch/usr/src/bin</font></div><div><font face="courier">cc -o ld -O -i ld.c -I/scratch/usr/include</font></div><div><font face="courier">cc -o nm -O -i nm.c -I/scratch/usr/include</font></div></blockquote><div> Now I had everything I needed to bootstrap ranlib... almost....</div><h3 style="text-align: left;">Drop into the chroot</h3><div>As readers of my blog know, I recently did some search into <a href="http://bsdimp.blogspot.com/2020/06/whither-chroot.html">chroot</a>. The reason was this effort. I'd recalled reading that it was added into 4.2BSD, etc. So I went looking and found an interesting story (that I've already told).</div><div><br /></div><div>Now you know why I was looking: the next step is to chroot into /scratch. Once we're there, we need to do a few things. First, let's copy things over:</div><div></div><blockquote><font face="courier">chroot /scratch<br />cd usr/src/bin/as<br />cp as /bin<br />cp as2 /lib<br />rm as as2<br />cd ..<br />cp nm ld /bin<br /></font><div style="text-align: left;"><font face="courier">rm nm ld</font></div><div><font face="courier">cp /bin/true /usr/bin/ranlib</font></div></blockquote><div></div><div>OK. That gives us a working assembler, loader and nm. What about cc? Don't we need to rebuild it? Turns out, no. It's already working, creating perfectly fine assembler. Since we just swapped out the assembler, we're good: it produces the new format. And the loader, it can combine them into binaries that will run (we're quite fortunate that the '195 loader can create binaries that work on ur2.11). What about ar(1)? Well, we don't have to bootstrap that either (at least not yet) since the format is the same, even if the program was imported from 4.3BSD in the 158-178 patch series. Finally, we avoid an extra step later by copying /bin/true to ranlib. This means the ranlib in the ur2.11 tree right now (which came from '195) won't create an entry in libc.a we have to delete later.</div><h3 style="text-align: left;">Building libc.a and crt0.o</h3><div>So, next up, we need to rebuild libc and crt0.o. cc uses these to create working binaries, and we need cc to rebuild ranlib. Thankfully, it's relatively straight forward to rebuild libc and install it:</div><div></div><blockquote><div></div></blockquote><blockquote><font face="courier">cd /usr/src/lib/libc</font><div><font face="courier">make clean</font></div><div><font face="courier"># Hack around make sometimes failing to descend on some runs</font></div><div><div><font face="courier">(cd pdp/compat-4.1; make)</font></div><div><font face="courier">(cd pdp; make)</font></div><div><font face="courier">make</font><div><font face="courier">make install<br /></font><div style="text-align: left;"><font face="courier">make clean</font></div></div></div></div></blockquote><div><div style="text-align: left;"></div><blockquote><div></div></blockquote><div></div><div>so now we've replaced the '195 libc.a with it's newer format binaries with ur2.11 libc.a with the proper for this version format. When building, you may have noticed tsort reported a cycle in the dependency graph. It's safe to ignore that for now, we'll work around it in a minute. Depending on dates of directories, you may need to build deep directories by hand because directories in the future aren't considered out of date so aren't rebuilt...</div><h3 style="text-align: left;">Building ranlib (for real)</h3><div>Now we can build ranlib, and use it to add a table of contents to libc.a. We'll need to specify libc.a twice in order for it to resolve the circular dependency. When linking libraries w/o the ranlib table of contents, ld only makes one pass through the library. So, if we list it twice, it will get the rest of the dependencies when it makes a second pass through the library. Since all the other symbols are resolved, we don't wind up with two copies of anything.</div><div></div><blockquote><div><font face="courier">cd /usr/src/usr.bin</font></div><div><font face="courier">cc -o ranlib -O -i ranlib.c -lc</font></div><div><font face="courier">cp ranlib /usr/bin</font></div><div><font face="courier">ranlib /lib/libc.a</font></div></blockquote><div></div><div>So, now we have a sane libc.a and ranlib.</div><h2 style="text-align: left;">Finishing up the Bootstrapping</h2><div>OK. We could go on from here and make a lot of progress. Along the way, though, we'll discover that there's some programs whose Makefile assumes certain things about ar, or want to exec the strip program, etc. So we'll build those now and install them to make for smoother sailing later. All the other dependencies are properly handled.</div><div></div><blockquote><div><font face="courier">cd /usr/src/bin</font></div><div><font face="courier">make ar strip</font></div><div><font face="courier">cp ar strip /bin</font></div></blockquote><div>And we're not quite done. install groks the binary format, so it has to be bootstrapped now before we use install -s as part of many make install targets:</div><div></div><blockquote><div><font face="courier">cd /usr/src/usr.bin</font></div><div><font face="courier">make xinstall</font></div><div><font face="courier">cp xinstall /usr/bin/install </font></div></blockquote><h1 style="text-align: left;">Doing the Build</h1><div>At this point, the simple way to build is to do the following</div><div></div><blockquote><div><font face="courier">cd /usr/src</font></div><div><font face="courier">make clean</font></div><div><font face="courier">make all</font></div><div><font face="courier">make install</font></div><div><font face="courier">make clean</font></div><div><font face="courier">make all</font></div><div><font face="courier">make install</font></div></blockquote><div>which builds everything twice. This is far from optimal, but will work. The things that fail the first time around, due to missing libraries and such, will succeed the second time through.</div><div><br /></div><div>One could look in the sources and find there's another process, 'make build' which installs the includes (well, that's commented out, and that caused version skew between /usr/src/include and /usr/include), builds and installs libc, builds and installs the C compiler, rebuilds libc, rebuilds and reinstalls the C compiler, then builds and installs usr.lib before building and installing 'bin usr.bin etc ucb new games' directories. This works mostly OK. However, in our situation, this leaves a big hole: there's programs in /usr/src/usr.lib that need other libraries in /usr/src/usr.lib, so they fail to build in the make build scenario. Plus, I've had it fail in the second build of libc for reasons unknown (it just fails to descend into the pdp directory, which it had no trouble doing the first time).</div><div><br /></div><div>So if you go and look at the bootstrap program, you'll see the following crazy dance that it does. Of course, it knows it's already built libc once (and it lacks the above workaround for libc, but the actual automation has it):</div><div></div></div><blockquote><div><font face="courier">cd /usr/src<br />make clean<br />cd lib<br />for i in ccom cpp c2 libc ccom cpp c2; do<br /> (cd $i; make all install)<br />done<br />cd ../usr.lib<br />for i in lib[0-9A-Za-z]*; do<br /> (cd $i; make all install; make clean)<br />done</font></div><div><font face="courier">ln /usr/lib/libom.a /usr/lib/libm.a</font></div><div><font face="courier">cd ..<br />make all<br />make install<br /></font><div style="text-align: left;"><span><span><font face="courier">make clean</font></span></span></div></div></blockquote><div><div style="text-align: left;"><span><span></span></span></div><div>which is similar enough to 'make build' but avoids the holes in it and avoids having to build absolutely everything twice (though it does build libc and the C compiler 3 times total, which likely is overkill). The funky pattern for building libraries is because there's a lib.b that's installed (it's just a text file with what appears to be B code in it). The link for libm afterwards is to mimic what the make install target does in usr.lib since we're not using it and libom.a is used for libm.a on 2.11BSD. Since we remove all .a's in creating the root, we have to recreate this here.</div><div><br /></div><div>In the end, we're left with a complete user land that we can then move to the next phase with. Once we have a kernel, we can rebuild the release tapes which I'll leave as a topic for another day. With the boot block rework, the disk label changes and the changing needs of the 2.11BSD community, rebuilding them for ur2.11 is somewhat different than 2.11BSD patch 469.</div><div><br /></div><div>As a workaround for some build issues, I also needed to build a number of man pages so the program associated with them would be properly installed... Suffice to say I rebuilt all the man pages in the end as part of the bootstrap script, but they aren't strictly required to run the system.</div><h2 style="text-align: left;">Building the Kernel</h2><div>Normally, one would re config the kernel and build it. However, in 2.11BSD as released, there were a number of hacks made to the kernel Makefile to get it to fit into memory. Normally, one would hack these things in /sys/conf/Make.sunix so configuring GENERIC wouldn't destroy any carefully worked out overlay, but that wasn't done initially. So, we have to be careful how we build.</div><div><br /></div><div>Also, in the initial version, the root partition was hard coded into the kernel. There was a script call /GENALLSYS that would create all versions of the: rpunix, raunix, xpunix, hkunix, etc.When installing, one needs to know the proper one to use. So, putting that all together, we can just do this:</div></div><div><br /></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><div><font face="courier">cd /usr/src/sys/GENERIC</font></div></div></div><div><div><div><font face="courier">make && make install && (cd / ; cp unix genunix; sh -x /GENALLSYS)</font></div></div></div></blockquote><div><font face="inherit"><br /></font></div><div><font face="inherit">which builds all possible bootable kernels...</font> </div><div><h2 style="text-align: left;">Building all the Standalone Programs</h2><div>When we built everything, a few things still weren't build: the boot loader, the autoconfig and boot program (which is different than the boot loader). One just needs to build in /sys/mdec, /sys/autoconfig and /sys/pdpstand:</div></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div style="text-align: left;"><font face="courier">cd /sys/mdec</font></div></div><div><div style="text-align: left;"><font face="courier">make && make install && make clean</font></div></div><div><div style="text-align: left;"><font face="courier">cd /sys/autoconfig</font></div></div><div><div style="text-align: left;"><font face="courier">make && make install && make clean</font></div></div><div><div style="text-align: left;"><font face="courier">cd /sys/pdpstand</font></div></div><div><div style="text-align: left;"><font face="courier">make && make install && make clean</font></div></div></blockquote><div><div>Once one has mdec installed, one needs to dd the blocks onto the disk to make it bootable. When I was bootstrapping this disk, I did it with the intention of making a bootable system. I had to add /usr to /etc/fstab too, but all the things I did might fill another blog entry...</div><h1 style="text-align: left;">Conclusion</h1><div>Building entire systems is messy, and has always been messy. Unless you skipped to the conclusion, I suspect that you've already formed this opinion about the 2.11BSD build process. I've managed to enshrine everything above into build.sh and build2.sh to make things automated. Using this technique I've managed to build a ur2.11BSD boot disk, created boot tapes and installed from those tapes. Automation was key, though, to recording all the right steps in the right order.</div><div><br /></div></div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com0tag:blogger.com,1999:blog-32797070.post-83605545029519794552020-08-03T14:34:00.002-06:002020-08-06T14:25:52.517-06:00Missing 2.11BSD patches<h1 style="text-align: left;">2.11BSD Missing Patches</h1><div>While looking into some date anomalies in the final image (since I'd like to get the dates right) I discovered a number of source directories had dates slightly newer than the date in the announcement. This lead me to discover some missing patches in a couple of different places.</div><h2 style="text-align: left;">The Anomaly</h2><div>I've automated the system generation, tape generation and installing from tapes to allow me to make small tweaks and get end to end testing. As part of this, after the system is installed, I'll do a test boot, similar to the following, as if I'd installed the system on April 10th, 1991 and booted it on April 15th. The boot looks something like this:</div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><font face="courier">sim> boot rq</font></div></div><div><div><font face="courier"><br /></font></div></div><div><div><font face="courier">boot: 73Boot</font></div></div><div><div><font face="courier">: ra(0,0)unix</font></div></div><div><div><font face="courier"><br /></font></div></div><div><div><font face="courier">2.11 BSD UNIX #1: Fri Mar 15 15:48:55 PST 1991</font></div></div><div><div><font face="courier"> root@wlonex.imsd.contel.com:/usr/src/sys/GENERIC</font></div></div><div><div><font face="courier"><br /></font></div></div><div><div><font face="courier">phys mem = 4186112</font></div></div><div><div><font face="courier">avail mem = 4008640</font></div></div><div><div><font face="courier">user mem = 307200</font></div></div><div><div><font face="courier"><br /></font></div></div><div><div><font face="courier">Apr 10 13:50:01 init: configure system</font></div></div><div><div><font face="courier">ra 0 csr 172150 vector 154 attached</font></div></div><div><div><font face="courier">rl 0 csr 174400 vector 160 attached</font></div></div><div><div><font face="courier">tms 0 csr 174500 vector 260 attached</font></div></div><div><div><font face="courier">ts 0 csr 172520 vector 224 attached</font></div></div><div><div><font face="courier">xp 0 csr 176700 vector 254 attached</font></div></div><div><div><font face="courier">erase, kill ^U, intr ^C</font></div></div><div><div><font face="courier"># date 9104151234</font></div></div><div><div><font face="courier">date: can't write wtmp file.</font></div></div><div><div><font face="courier">Mon Apr 15 12:34:00 PDT 1991</font></div></div><div><div><font face="courier"># Fast boot ... skipping disk checks</font></div></div><div><div><font face="courier">/dev/ra0c on /usr: Device busy</font></div></div><div><div><font face="courier">checking quotas: done.</font></div></div><div><div><font face="courier">Assuming non-networking system ...</font></div></div><div><div><span style="font-family: courier;">preserving editor files</span></div></div><div><div><font face="courier">clearing /tmp</font></div></div><div><div><font face="courier">standard daemons: update cron accounting.</font></div></div><div><div><font face="courier">starting lpd</font></div></div><div><div><font face="courier">starting local daemons:.</font></div></div><div><div><font face="courier">Mon Apr 15 12:34:01 PDT 1991</font></div></div><div><div><font face="courier"><br /></font></div></div><div><div><font face="courier"><br /></font></div></div><div><div><font face="courier">2.10 BSD UNIX (my.domain.name) (console)</font></div></div><div><div><font face="courier"><br /></font></div></div><div><div><font face="courier">login:</font></div></div></blockquote><div>I set the date in single user then bring it up to multiuser. In one of my tests, I found the following:</div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><font face="courier">-rw-r--r-- 1 imp imp 9777 Aug 31 1991 alloc.c</font></div></div><div><div><font face="courier">-rw-r--r-- 1 imp imp 4817 Aug 31 1991 alloc11.c</font></div></div><div><div><font face="courier">-rw-r--r-- 1 imp imp 12474 Aug 31 1991 doprnt.c</font></div></div><div><div><font face="courier">-rw-r--r-- 1 imp imp 3299 Feb 23 1987 doprnt11.s</font></div></div><div><div><font face="courier">-rw-r--r-- 1 imp imp 831 Aug 31 1991 printf.c</font></div></div><div><div><font face="courier">-rw-r--r-- 1 imp imp 20446 Aug 31 1991 sh.c</font></div></div><div><div><font face="courier">-rw-r--r-- 1 imp imp 1771 Aug 31 1991 sh.char.c</font></div></div></blockquote><div>which I thought was quite strange. There shouldn't be any files dated newer than the release in the tree. I know all files patched don't get the time set right, so I exclude those from my search (I plan on fixing that bug later). The above files (and others, it's just a short list) shouldn't be there. So I started looking...</div><h2 style="text-align: left;">The Diffs</h2><div>Running diffs against 2.10.1 I discovered that the csh files were almost all the same. However, a typical diff looked like:</div><div><br /></div><div><div><font face="courier" size="2">diff -ur root-2.10.1/usr/src/bin/csh/alloc.c root-2.11/usr/src/bin/csh/alloc.c</font></div><div><font face="courier" size="2">--- root-2.10.1/usr/src/bin/csh/alloc.c 1987-02-08 15:27:23.000000000 -0700</font></div><div><font face="courier" size="2">+++ root-2.11/usr/src/bin/csh/alloc.c 1991-08-31 01:03:00.000000000 -0600</font></div><div><font face="courier" size="2">@@ -4,10 +4,10 @@</font></div><div><font face="courier" size="2"> * specifies the terms and conditions for redistribution.</font></div><div><font face="courier" size="2"> */</font></div><div><font face="courier" size="2"><br /></font></div><div><font face="courier" size="2">-#ifndef lint</font></div><div><font face="courier" size="2">+#if !defined(lint) && defined(DOSCCS)</font></div><div><font face="courier" size="2"> /* From "@(#)malloc.c 5.5 (Berkeley) 2/25/86"; */</font></div><div><font face="courier" size="2"> static char *sccsid = "@(#)alloc.c 5.3 (Berkeley) 3/29/86";</font></div><div><font face="courier" size="2">-#endif not lint</font></div><div><font face="courier" size="2">+#endif</font></div><div><font face="courier" size="2"><br /></font></div><div><font face="courier" size="2"> /*</font></div><div><font face="courier" size="2"> * malloc.c (Caltech) 2/21/82</font></div></div><div><br /></div><div>which removed the SCCS IDs from the binary to save size. Other changes included introducing overlays for the first time. This indicated size issue. Let's take a look at what else was going on around the 31 Aug 91 in the patch stream. Looking, we find that this is just after patch 18 (which fixed a long vs int bug in test) as well as patch 17, which updated pcc. This sounds like a size hack by someone that had just updated the compiler, or was testing with pcc (the normal system compiler wasn't pcc, but the earlier Thompson compiler). Another of the changes also fixes an issue with character handling, which other patches have done to reduce the size of binaries that got too big.</div><div><br /></div><div>So, in context, this change makes perfect sense. The only trouble is that it wasn't posted to comp.bugs.2bsd, nor did it make it into Steven Schultz's patch repo. And csh isn't the only troublesome one. There's issues in rn, and games/warp.</div><h2 style="text-align: left;">The Catch Up Patch</h2><div>There was a catchup kit that was issued officially as Patch 80 (though it omitted patch 79). Looking in that patch kit we find this change! So it's in one that was intended. So what to do? And it turns out there's 5 such patches (but only 4 of them made it into the patch kit... I'll talk about #5 in a minute).</div><div><br /></div><div>I've decided to look at the dates of each of these patches and pretend they happened just after the patch whose date is closest). I've updated my mk211bsd script to extract these from the catch up patch.</div><div><br /></div><div>Oh, and there were a number of new programs added in the catchup patch as well. These must be deleted too, but I'd already noticed that and deleted them.</div><h3 style="text-align: left;">tftp changes</h3><div>So, on May 4th, 1991 a patch to dd.c was posted to comp.bugs.2bsd. It's also included in the official archive as patch 1. The release announcement was dated March 14th, 1991. But there's tftp files dated May 15th, 1991. What's up with those? Turns out, this is another missed patch (but one that's assumed to be in place in the catch-up patch because it's not in there. Well, it's partially in the patches, partially in the scripts. It's an update of tftp and tftpd to a new version. It was posted to comp.bugs.2bsd on May 15th, 1991, but isn't in the official list of patches. So not only do we have to dig it out of the catch-up patches (from two different files), we also have to restore the old man pages from 2.10.1BSD, but in a different place, so this patch will be a patch + rm (which going backwards is patch + cp)</div><h3 style="text-align: left;">csh changes</h3><div>As discussed above, these are various hacks to get the size of csh down.</div><h3 style="text-align: left;">warp changes</h3><div>The changes here are around the config script used to generate files for the build. The changes use full path names, and cope with the new shadow password format changes.</div><h3 style="text-align: left;">pcc changes</h3><div>[[ edit -- these were poorly documented: they are in patch 17, but not called out specifically to apply ]]</div><h3 style="text-align: left;">rn changes</h3><div>As part of the catchup, there's a number of minor patches to rn that were included in the catch up, but weren't formally published or occupy a number of their own.</div><h2 style="text-align: left;">My Work</h2><div>So, how does this affect me? Well, it means that I need to understand the catch up patch a lot better. I had hoped to use it later as a cross-check against my work. I didn't anticipate that I'd be using it "sooner" as to get missing bits I'd found using other techniques. I've had to update mk211bsd to extract the bits, as well as creating a couple of hints files to help me undo the changes.</div><div><br /></div><div>And when the time comes to reply all the patches, I'll need to take these anomalies into account as well. But that's a problem for future me.</div><div><br /></div><div>I also have to complete the audit of the weird file dates. There's 63 of them right now, 29 in /usr/src still. Some of clearly old man pages that I can remove. Some are the result of running 'configure' or similar script (rn has 7 of these). Some are config files that change over time (like for the root name server). Some may be just left-over detritus of a running system. I need to see which ones fall into which categories and update accordingly. This may dovetail back into needing to bring them back to make sure I can march back to pl195 and get the same system. Since I started with ~1500 such anomalies, I think being down to 63 is quite good. And there's others elsewhere in the system... </div><h2 style="text-align: left;">Current status</h2><div>As you might guess, if I'm finding things like this, that means I'm getting closer. I've shared a lot of this on my <a href="https://twitter.com/bsdimp">@bsdimp</a> twitter account, but now is a good time for a wrap up. Here's what's done currently:</div><div><ol style="text-align: left;"><li>Script to undo all the patches, including helper 'hints' scripts, where possible from existing artifacts.</li><li>Miss patches reconstructed and integrated into the build</li><li>Automated installing 2.11BSDpl195 image</li><li>Automated bootstrapping back from 195 -> 0. There's a number of interesting problems here that I'll blog about soon</li><li>Building the 2.11BSD pl 0 tapes automatically</li><li>Test installing the pl 0 system from the pl 0 tapes.</li></ol><div>The missing bits include</div></div><div><ol style="text-align: left;"><li>Getting the dates right (or failing that plausible) for the patched files</li><li>Finishing the date audit and tracking all anomalies to ground.</li><li>Cleaning up my helper scripts off the image</li><li>Creating a github repo with all the patches in it</li><li>Reproducing the build on a second system</li><li>Getting the ownership right for some files (eg using the mtree hack to get the ownership and permissions right, generating it from the pl195 tape/image, etc)</li><li>Getting dates right on /, right now restor(8) doesn't restore the date in one at a time mode, so these are all wrong.</li><li>Fixing tmscp boot. It's broken. The tmscpboot.s, ported from tkboot.s, only existed for a short period of time and has been lost. My reconstruction has issues (it won't boot), and I've not delved into why.</li><li>Creating automation to ensure that the 'catch up' kit will apply cleanly.</li></ol><div>And of course, I need to figure out the best way to publish the artifacts when I think I'm done.</div></div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com0tag:blogger.com,1999:blog-32797070.post-5508601261507120552020-07-27T12:53:00.004-06:002020-07-28T13:51:57.744-06:00When Unix learned to reboot(2).<h1 style="text-align: left;">History of Reboot(2)</h1><div>Recently, a friend asked me the history of halt, and when did we have to stop with the sync / sync / sync dance before running halt or reboot. The two are related, it turns out.</div><div><br /></div><h2 style="text-align: left;">That sync; sync; sync Thing...</h2><div>If you go looking around the net, you'll find some people giving advice like "when shutting down, type 'sync; sync; sync; halt' to be safe." There's good reasons behind this advice which aren't immediately clear and are interesting to explore. Before exploring, I'd been told that the reasons for the sync dance were a driver bug in v6 that's been fixed 45 years ago... But it turns out whoever told me that must have been mistaken because the code tells a different story...</div><div><br /></div><div>The sync program called the sync system call and exited (and still does). The sync system call in research editions of unix was implemented as approximately:</div><div></div><blockquote><div><font face="courier"></font></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><span style="font-family: courier;"><div><span style="font-family: courier;">foreach mountpoint</span></div></span><span style="font-family: courier;"><div> write superblock with bwrite</div></span><span style="font-family: courier;"><div>for each dirty inode</div></span><div style="text-align: left;"><font face="courier"> write the inode with iupdat</font></div><div style="text-align: left;"><font face="courier">bflush</font></div></blockquote><div> </div><div>It would step through the fixed list of buffers in the system, writing the dirty ones out. It used bwrite() to do this, which was synchronous. Each write had to complete before the next one started. iupdat will read the inode off the disk, update that inode, and write out, again synchronously. bflush writes everything with bwrite, but marks the buffers as B_ASYNC which means in that case it won't wait. And nothing else waits either. So, recommendation for typing sync 3 times, one line at a time, was to give time for the buffers to drain (the subsequent syncs would schedule no new I/O on a quiet system). Typing all three on one line with semicolons, didn't give this time...</div><div><br /></div><div>If you look at the recommendation, it's actually quite smart. Typed one line at a time, waiting for the prompt each time, would schedule a lot of I/O the first time, then give the operator a harmless task to do for a few seconds that would allow the I/O to complete before they did anything. The kernel avoided all kinds of nasty deadlocks that later systems would face when they implemented waiting for the I/O to complete.</div><div><br /></div><div>Edit: One bit of lore that was passed on to me was the first sync returned right away, but the second one blocked.... I've found no evidence of that in BSD or System V based systems... although there is an increasing amount of protection against multiple threads being in the sync code as concurrency in Unix increased.</div><h2 style="text-align: left;">Why not do this in reboot(2)?</h2><div>None of the versions of Research Unix had a system call to reboot. To restart things, one killed init with SIGHUP, which would in turn kill everything else and fork a new shell in single user. There was no other way to restart the system, and bad things happened if init actually died. But there was no clean reboot option, nor any way to stop the kernel cleanly (apart from the power switch).</div><div><img height="357" src="https://i.imgflip.com/49g6m4.jpg" width="256" /></div><div>Looking at the sources, there was one small hint that something was planned, but never executed. All the system calls were defined in /usr/include/sys.s. A close examination shows the following:</div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><font face="courier">lock = 53.</font></div></div><div><div><font face="courier">ioctl = 54.</font></div></div><div><div><font face="courier" style="background-color: #04ff00;">reboot = 55.</font></div></div><div><div><font face="courier">mpx = 56.</font></div></div><div><div><font face="courier">setinf = 59.</font></div></div></blockquote><div>which proves me wrong, right? Well, maybe not. Looking at sysent.c, we see the following:</div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><font face="courier">1, 0, syslock, /* 53 = lock user in core */</font></div></div><div><div><font face="courier">3, 0, ioctl, /* 54 = ioctl */</font></div></div><div><div><font face="courier" style="background-color: #04ff00;">0, 0, nosys, /* 55 = readwrite (in abeyance) */</font></div></div><div><div><font face="courier">4, 0, mpxchan, /* 56 = creat mpx comm channel */</font></div></div><div><div><font face="courier">0, 0, nosys, /* 57 = reserved for USG */</font></div></div><div><div><font face="courier">0, 0, nosys, /* 58 = reserved for USG */</font></div></div><div><div><font face="courier">3, 0, exece, /* 59 = exece */</font></div></div></blockquote><div><font face="inherit">which lists 'nosys' as the handler, so there's no implementation. There's no reboot system call. I'll also note that there's another disconnect: system call 59 is listed as setinf (whatever that is), but is implemented as exece.</font></div><h2 style="text-align: left;">Enter 4BSD</h2><div>The first reference to reboot(2) I can find is in 4.0BSD in sysent.c, we see the following;</div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><font face="courier">3, 0, ioctl, /* 54 = ioctl */</font></div></div><div><div><font face="courier" style="background-color: #04ff00;">1, 0, reboot, /* 55 = reboot */</font></div></div><div><div><font face="courier">4, 0, mpxchan, /* 56 = creat mpx comm channel */</font></div></div></blockquote><div><font face="inherit">where reboot landed in the slot allocated for it. There's a new command in /etc/ that calls it (by the syscall number, not the normal wrapper). It wasn't in 2.8BSD, but is also present in a similar form in 2.9BSD and later. 3BSD still has the placeholder pointing at nosys. Since the 2BSD evolution tracked 4BSD, I'll not call it out further.</font></div><div><font face="inherit"><br /></font></div><div><font face="inherit">In 4.0BSD (1980), reboot() just call a machine dependent boot() routine. It called update(), which scheduled the writes as described above. It printed that it was waiting for the IO to finish. However, the 'wait for it' code was basically 'sleep(5)' and so if all the data didn't get out in 5 seconds, bad things would happen. So the "sync sync sync halt" dance was still useful advice. It would get thee ball rolling and easily double the amount of time that the data had to make it to the disk, depending on the typist... 4.1c (1982) bumped this to 10s and had ifdef'd out code to try to wait for all the dirty buffers to clear.</font></div><div><font face="inherit"><br /></font></div><div><font face="inherit">In 4.2BSD (1983), the wait for the writes code is engaged. It tries up to 20 times to walk the list of bufs in the system to let the buffers drain. So progress is made here. 4.3 adds a delay that's 40ms * iter (total of 8.4s)... which remains through at least 4.4BSD (1993)... So while things got better, so did systems, and more and more I/O could be piled up. Successor BSD systems improved on this as well, including various ways to solve it (mostly when systems got big enough so update(8) couldn't flush all the I/O in 30s before the next sync call started).</font></div><h2 style="text-align: left;"><font face="inherit">AT&T Unix</font></h2><div><font face="inherit">Meanwhile, on the AT&T side of things... System III (1980) didn't have anything. System Vr1 doesn't have anything. None of the Programmer Work Bench releases (PWB) have a reboot(2).</font></div><div><font face="inherit"><br /></font></div><div><font face="inherit">System Vr2 (1984) defined a new uadmin(2) system call. It acted like an indirect system call (you passed it what you wanted it to do as the first arg). One of these, A_REBOOT, is called from fsck, but the kernel doesn't implement it.</font></div><div><font face="inherit"><br /></font></div><div><font face="inherit">Fast forward to System Vr3 (1987) and we find an implementation. It's basically a call to umount for the / filesystem followed by a call to reset the CPU. The other filesystems are unmounted as part of shutdown process before uadmin(A_REBOOT, ..) gets called, so only / remained mounted by the time it's called. This call to umount flushes the dirty buffers, and cleanly unwinds everything else so nothing is pending when the call to the CPU reset happens. So finally the 'sync sync sync halt' problem had been solved... Well, maybe... There's no timeout, nor any way to avoid deadlock. Still, a fairly clean solution to the issue, especially relative to what BSD was doing at the time.</font></div><h2 style="text-align: left;">Commercial Unix</h2><div>The availability of even leaked source from the early days. By the time SunOS gets to 4.1, however, there was a vfs_syncall() which the MD boot() function called to synchronize everything (it only returned when all the scheduled I/O was done). I've not checked to see if there was a halting problem here or not, but empirical evidence of rebooting a lot of suns suggests that it was rarely a problem in practice if any of the I/Os somehow got wedged... Or that I was lucky enough not to have a large enough fleet of machines where flaky disk problems start to show up... I can't find any earlier versions of the Sun sources, so it's hard to know when this solution entered into the tree (the code I have looked at dates from 1994, 11 years after the initial release). I suspect Sun solved this problem early, but have no proof of this beyond a hunch.</div><div><br /></div><div>Other Unixes, that aren't just System V ports, are hard to find in source form, so I can't say from original sources whether or not they solved the issue or not prior to System Vr3. There were also a lot of 4.2BSD and 4.3BSD ports that didn't survive either to be examined.</div><div><br /></div><div>The one exception to this general rule was a copy of the Unisoft 1.0 kernel I found on bitsavers. It dates from 1986 (so relatively late). It has a reboot system call (number 64, not 55). That system call calls update(), like 4BSD's, but then does a big for() loop (1 to 1,000,000) before calling a routine that resets the CPU. This kernel is a V7 port, and most likely got the idea (and maybe the code) from one of the 4BSD releases. This kernel appears to be the basis Sony's SUNIX (which appears to be a 7th Edition-based Unix that predated SONY's NEWS-OS based on 4.2BSD). NEWS-OS likely behaved like 4.2BSD, but I can't confirm that due to lack of sources. If you know more info about SUNIX or NEWS-OS, please leave a comment.</div><h3 style="text-align: left;">Linux</h3><div>Linux's sync call is synchronous. You get the same guarantees as you do from fsync. This behavior was introduced in 1.3.20, released in 1995. Prior to that the same sync dance advice was useful since early versions of Linux were more aggressively asynchronous in their handling of disk writes than other contemporary systems. While this helped it compete in benchmarks, it caused data integrity problems when Linux machines started to be put into production (which was one of the reasons motivating the change). Modern Linux systems flush out all the dirty buffers as part of the shutdown sequence and wait for the flush to complete before proceeding to reboot, turning the system off or halting.</div><h2 style="text-align: left;">Conclusion</h2><div>For years, I'd been told the reasons for the 3 sync dance was due to a driver bug, long since fixed, in a DEC disk driver in v6. However, digging into it shows that there were decent reasons for doing this dance, even after Unix learned to reboot() itself.</div><div><br /></div><div></div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com2tag:blogger.com,1999:blog-32797070.post-89113312976829784142020-07-24T19:33:00.001-06:002020-07-24T19:33:46.284-06:00First screen shot of 2.11BSD as releasedMy automation produced this today...<div><br /><div><img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkAAAAMwCAYAAADIz99DAAAgAElEQVR4Aey9+d+Pxfv//2pVaVcpStGCLIm0qFRStCoihVdRSSmFspUSWRO96E3KkiVCIURCKS1/1nxu9/l+j/M217nMc7me1+W6PB8/nLdzmZljjjnm8Tzn8Txmzjn+85///Melj8cee8z9+++/7p577smkde7c2f31119u79697tVXX3WbNm3yeR999FEXSzvjjDPcokWLfN5169a5sWPHut9//929++67zuqjzvXr17s1a9b4fAMHDnTPP/+8vx48eHCiy7Zt29y3337rzjrrLLdx40Z3/PhxN3HiRPf555/7vHfeeWeSN9023Wf7WzaRTYQBYUAYEAbqEAPZTn/ppZc8kejZs6cnEitXrnSbN2/2ZGTy5Mk+rU+fPj6tbdu2nhB9+eWXLpbWrVs3X2727NkJOTl06FADAvTFF1+4M88801144YXun3/+cR988IFr06aN+/nnn9327dt9GvVClJ544gl36623+mvK9erVyz3wwAP+/s0330zqqMMOVdtzSL1wkP2dyyayiTAgDNQ5BrIAuO+++zyReOGFF/xgOmzYMH+Pt2bhwoWenJx99tnJQLt161b3448/RtNGjBjhZdx1111JuV9++aUBAerUqZNPO//88z2pmj9/vr8fM2aML/vwww+7BQsWOMqde+657plnnvHPIUR4geyYPn16Ukedd67sIDIkDAgDwoAwIAzkYyBLgK644gpPLPD8GIGAZECAOLi+5ZZbfBpEhKksprViaUZievTo4cuFpMqmwK688kqfxnQXdTD9Rf0QIkjPkSNH3N9//+3eeOMN/7xfv34+H9NvpqfO2f6UTWQTYUAYEAaEAWEgg4HMA08m5syZ48nFa6+95q666ip/DcGxKaivvvrKDRkyxOGlgayMHj06mtalSxefj+kqpqj+/PPPRKYRoKFDhzrqg+ww7WWEiE6zaTkIUPv27b2OTI8dOHDA57333nsdnqsZM2a4p556SoQon+3KLrKLMCAMCAPCgDDw/2EgnwAxxcWiZSMq5gGCjEB27DlrdWbNmuVsSiyWNnfuXO/B+eOPPzzR2b9/v3v77bfdI4884skQdbDAeu3atX59T8hWL7vsMp8HncLnN954o9u1a5dPQxfWCiEvzKPr/D6WXWQXYUAYEAaE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hAFhQBgQBoSB+sCACJBYvzAgDAgDwoAwIAzUHQbqrsFi9vXB7NXP6mdhQBgQBoSBGAZEgMT6hQFhQBgQBoQBYaDuMFB3DY6xQaXp34IwIAwIA8KAMFAfGCgmQJ06dXJ33323u+yyyxqA4ZxzznE9e/Z0d911l+vQoUODtLPOOstxtCQmTTvGjBnj3n//fffyyy83u27t2rVzw4cPd23btm1U3RdeeKF7+umnXZ8+fRI5Z5xxhuvcubO755573HXXXefOPPPMJM36gP4gn92XOl966aW+jnTf1qJcni5dunRxAwYMcN26dXNnn312Az1julSads0117ixY8e69u3bN6ijVLuUXvyOkG1kG2FAGGjFGMh2HoPQ/Pnz3b///pscEAga2bFjR/fnn38mz8nz+uuv+zQGYivzzz//uAMHDviBvxbGmTRpUoOBv1yZN998s/vtt9/8sXPnTnf06NFmH/wgkdgFXYr0jrXv3HPPdR999JG3+99//+2eeuopL+fqq6923333XWJz6oBIhHWMHDnSp0PAwudF1+Sn76wf58yZUxZ5KqdcWpfLL7/c/fjjj0ld1Ll582Z30UUXeV1jMqtJu/XWW93vv//u2/fll1+6K664oiybFNlKz7PvDtlENhEGhIFWhIFsZ7300kvOBloG7S+++MIPUgwg559/vhs6dKi78cYb3Q033OAYSE6ePOkYzG666Safb/Lkye7hhx92X331lR9sajHQMCijV6WGfe+99zzpwQtTadla5S+HABW1D2/b559/7u34wgsvOLwe6IUnZceOHZ5A3H777d6rgRfI0slzyy23JGQGwlCqPfQ1JOSTTz5xeEs+/vhjf//kk09Gy5ZTLk8XPGLohQcILyMkkPofe+wxTxaLdInVF0uj/eedd57HJkT4+++/z3g3S9lI6dn3hWwimwgDwkArxUC24yA127dvTwa9Bx980A9MM2fOTJ7RWAbbb775xv3xxx+eGBkBsgHzlVde8eVsyoEps40bN3pCgvwRI0Yk8orSrr/+ej8Nx2A4b948fw2hgHDFDM5ARz48JLt27UrKmXdh+vTpbsaMGX5KDF1+/fXXhGAV6fLBBx+4d999123bts1t2bLFPfPMM+7QoUNu2rRpUV2MAOG5Wb16ta8LUsOUVqn2Qfpo+3PPPdegDggmz++9994Gz80mEFXajdeLfOUQ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oUPdK6+84mUOGzbMl+vUqZP7448/3KJFixI5oQ7pa4gdbW/btq1bsWKFM7tWY8+07PT9999/n9jN2vHqq6+Wpedbb73ly15//fVl5be6sa/V9c0335QsO3LkSPfrr7+6v//+2x0/frxkfqunXFwjH30gWVY2do71QywtJhMd6HOzy5w5cxKib8/C88GDB6O6duzY0f3555+JPMq+/vrrSZlq9Lz22msTefTFrl273KxZs1ybNm2iv7/9+/cn5cI2cB3+7tL2KdV/RTartly6ft1nxwrZRDZp5RjIdiADLS8T/jHhUZk0aZJ/YZX6t33hhRc6yMahQ4d8/tmzZycv2FhazIA33XSTlzV58mT38MMPu6+++soPDFdccYW74IIL/EDIMwgIL+R+/fr5Ou+++25fbuzYsW7IkCGeODCg8O83Vt+LL77oy1111VVJvq1bt7r58+c7S4Mk8M8VOZbGv+tevXq5p556ypd/8803/f3FF1/saPvPP//sdeUFv3btWj8YQYRiuljalClTHCSBfmEQGzRokJdZZGsrV835hx9+cOvXr/e60x4ObF2OLPS7+eaby8obygNn1LNjxw63cePGssu/8cYbFRGgcnB9yy23JMSD30CoZ951DNextDxZ9gwbQgY++eQTd8011yR/KCD7/Anhd2iH4Y0+s/J55/PPP99BxvGe3XDDDe7LL790J0+edJCDavWE6KLnO++8439XYJ77999/38V+f3379nX33nuvsz8U06dP9/d4m2Oe5lj/xWxWbbk8O+pZdryQTWSTVoyB0p3HC44XW/fu3aMvWV5evMQgAwykIQGKpcWMZwSIlz/5zJvSvn17h7ubf54QIF7woRx7AXPmOTpBQhYsWNAgX1iGayM5MQKELWxwNAJkcuxFbPrac0gY5X755Rd/fu2116J6UO69995zX3/9tTt69Kj3GG3bts2XxUtSjj0HDhzo63vppZdK1mV60m+ff/55bn4GKrxPL7/8stu+fbsndMju2rWrJ4LY4ttvv81MIZrsUmfaagTozjvvdFu2bPF9bOU2bNjgnnjiiUS3SgmQybFzGtdgCC/Gzp07vZ2tjy1/3jnWD7E0k5XXR9gZXPPnA3JiHk7sY+XszG8Mb2JIPPNkWn7O/G7AEOVoczl6huXt2gjQM888k+iFdwcMlPP7K/qtmPxS57D/KrFZteVK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IAx0Ogx0ug6LibdNJq5x0bgIA8KAMCAMtCYGignQkCFDsnvuuScbPnx49qMf/agmpX74wx9mV111VVmdXr16Zb/85S+zm266qSyviH136dIl41OUTzu/+MUvsl/96lfZddddVyrn9WJ6pGShe5jPtfcnr4fnUd7bC1Pu036qXthW6nuPHj2yhx9+2OyXKtfIvN/+9rdm20bKzMsaOXJktmLFipoxlpdzJQBgvbgAAB8lSURBVK779++fPfHEE9mNN97YBDO16nIlxrYaHW+99dZs1qxZ9vnd735XdR8bZZdqdFSZ4me4bCPbCANJDJRn9u7dOzt+/Hj23//+t/Q5dOhQ1rNnz4oPQOq+8sorVm/16tVNys+ZMyf7z3/+U5L54osvRklSOGCDBw8ulafumTNn7GHsZR588MHs9OnTpTLoDFkbM2ZM6d5XX32Vvf3229mUKVOa6OMywvT3v/+91evTp0+p7AcffGB98ry77767LC/UM7TbtGnTsqeeespkzpw50+oNGjQo++abb7LNmzeX5IQ65L937do1+9vf/pb9+9//zr7//vvsoYceqqpeXk4911988UX217/+tUXbW758udnnZz/7WYu2U0//K9WBeP/rX/8yXO/evTu7/vrra+rDlRzbSn0jn9/shQsXDHdff/111X1rrl2q0U1lyp/dsolsIgzUhIHywtdcc409+PAA4VFZunSpTVCV/gHyLxaywaQJCVi3bl3pgfnzn//c7m3cuDHj36GTJAhMasBuu+02q7ds2bLs/vvvz959912bbJhounfvbg9n7kFABg4cmI0ePdrk/eY3v7F6/DufOnVqtmPHDqv361//OtnevHnzrN4NN9xQKvfhhx9mr776auZ5n376acmj43k//vGPszvuuMPICX3/85//bNc//elPM+zyz3/+03SFWL3zzjtGZiBCqb6Th9y33nrLdP/DH/6Q4UGrVKeR+a1BgMAb+Gik3q0p6yc/+Ylh8+LFixnYCL2QKT2u9NimdMvnPfPMM1ktBIj69dol37auy5/RsolsIgw0BAOVhfzlL38xUnD77bcnJyk8LyyZ8WA/duxYEwL03HPP2b9IJgcIgXtt9u7dm5TpBMiJkntTWHKADOARgQBdffXVTeQ4ASIFKOgECXnttdealMuDyElOigBBcPhnTF0nQC7HiZ7r6/chYdT78ssv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" /></div><div><br /></div><div>which is the first time something close to a 2.11BSD, unmodified, has booted in 30 years... Alas, it's only in SIMH, but still, I've reached 'as released' or as close as I can reconstruct.</div></div><div><br /></div><div>I've uploaded all the tools to <a href="https://github.com/bsdimp/mk211bsd/">github</a> if you'd like to check it out. I've not yet uploaded images, since I want to cleanup a blog I've been keeping about this and post them with that (also gives me a chance to tweak a few things (like give a real domain-name) if I wanted to do so...</div><div><br /></div><div>A great note to end the week on...</div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com0tag:blogger.com,1999:blog-32797070.post-61868299685380197492020-07-21T09:01:00.000-06:002020-07-21T09:01:30.792-06:00Adding Networking to the 2.11BSD pl 195 system<h1 style="text-align: left;">Adding Networking to 2.11BSD pl 195</h1><div>So, now that I have an auto-installer, it would be nice, sometimes, to have networking. It also gives us a chance to push the envelop a little and learn about kernel builds. These instructions are for FreeBSD, alas, and other system may differ. However, the first section is the only part that's FreeBSD specific.</div><h2 style="text-align: left;">Simh config changes</h2><div>I added the following to my simh.ini file:</div><div><div></div><blockquote><div><font face="courier">SET XQ ENABLED</font></div><div><font face="courier">SET XQ TYPE=DEQNA</font></div><div><font face="courier">SET XQ MAC=08-00-4b-13-37-12</font></div><div><font face="courier">ATTACH XQ tap:tap0</font></div></blockquote><div>and I also have the following in my /etc/rc.conf file:</div><div><font face="courier"></font></div><blockquote><div><font face="courier">cloned_interfaces="tap0 bridge0"</font></div><div><font face="courier">ifconfig_bridge0="addm em0 addm tap0 up"</font></div><div><font face="courier">ifconfig_tap0="up"</font></div></blockquote><div><font face="courier"></font></div><div>and the following in my /etc/sysctl.conf file:</div><blockquote style="font-family: courier;">net.link.tap.user_open=1<br />net.link.tap.up_on_open=1</blockquote><div><font face="inherit">These create a tap0 device, add it to the bridge0 device along with em0. em0 is my ethernet device, configured elsewhere.</font></div><div><font face="inherit"><br /></font></div><div>For other OSes, you'll need to do something different for this section, but the rest of the blog is still useful.</div><h2 style="text-align: left;">Building a Networking Kernel</h2><div>The GENERIC kernel that's installed lacks networking. It works on a wide variety of machines, but since the installation is from tape, there's no networking support (it's too big). So you'll need to build a networking kernel. This can be a bit tricky in the general case. However, given the machines selected, there's a close match to the SMS kernel. The instructions in the installation guide, however are a bit off. Well, not wrong, per se, but configuring kernels on 2.11BSD can be tricky. The documented instructions are straight forward enough;</div></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><font face="courier"></font></div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"></blockquote><span style="font-family: courier;"></span><blockquote><span style="font-family: courier;"># cd /usr/src/sys/conf</span><br /><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"></blockquote><span style="font-family: courier;"># ./config KERNEL</span><br /><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"></blockquote><span style="font-family: courier;"># cd ../KERNEL</span><br /><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"></blockquote><span style="font-family: courier;"># make all</span><br /><div style="text-align: left;"><div><font face="courier"># make install</font></div></div></blockquote><div><font face="inherit">which are familiar to old-time BSD hackers. Configure the kernel, cd to the build dir, then build and install it. However, with 2.11BSD, space is at a premium. This means that sometimes the make all will fail. if something is too big it will fail. The instructions for this are vague (move things around until it works, here's a few constraints to work with).</font></div><div><font face="inherit"><br /></font></div><div><font face="inherit">2.11BSD uses overlays to fit into the 64kB address space that the kernel has to work with. Well, on the PDP-11 that 2.11BSD runs on, there's actually 128kB of address space: 64k for instructions and 64k for data. These machines have separate I&D spaces, as this is called, managed by the MMU. And since things are managed by a MMU, there's an overlay scheme the kernel uses to fit that maps the upper 8kB into an 'overlay' region that the linker arranges to flip between as needed using one of the MMU segments. So this limits the 'base' part of the kernel to 56kB, and the overlays to 8kB. You can have many overlays (the kernel has 8 predefined). There's a small performance hit for calling routines in an overlay,</font></div><div><font face="inherit">but it's not too bad unless the routine is called all the time. Think of it as a fairly static form of dynamic paging the VAX and others would introduce later. Finally, data isn't </font>overlaid<font face="inherit">: the sum of the Data and the BSS sections have to be strictly less than 64kB. Many changes in the 469 patches concern saving space in the kernel in different ways. For a primer on details of text, data and bss, you can see <a href="http://bsdimp.blogspot.com/2020/07/traditional-unix-toolchains.html">traditional toolchain blog</a>.</font></div><div><font face="inherit"><br /></font></div><div><font face="inherit">So the trouble comes when you configure too many things into the kernel (or the options align just so in a bad way to create a base > 56kB or any one overlay > 8kB). So, when this happens, you have to move things around a little (or a lot0. The canonical way to do that is to edit the /usr/src/sys/KERNEL/Makefile to move different .o files around so things fit. And when I've done this movement, I've had to do a make clean and start over to get the kernel to link properly (some of the helper programs built aren't properly rebuilt). Oh, and if the overflow is really big, the build stops at a stop where you think there's undefined symbols. But they are just from the network stack. I'll explain that in a future blog since it's a little non-standard, but kinda clever in how they shoe-horned a 62kB network stack into the kernel that's already out of space...</font></div><div><font face="inherit"><br /></font></div><div><font face="inherit">So, if you were to follow those directions for the SMS kernel at patchlevel 195, you'd hit this snag. One nice thing about the config shell script is that it saves a copy of the old Makefile. The SMS kernel comes pre-configured (eg pre-tweaked to be small enough). Diffing the makefiles reveals the fix. Moves vm_swp.o from the BASE set of objects to the OV6 set of objects. These are the swapping routines that swap things out. So while this is less than ideal, this is for an I/O operation, so the slight overhead of MMU segment flipping is acceptable. However, knowing what you can move and why it's OK is a black art that's likely learned by a lot of trial an error (and a good backup copy of Unix for the inevitable ooops).</font></div><div><font face="inherit"><br /></font></div><div><font face="inherit"><font size="5"><b>tl;dr:</b></font> do follow the directions. Instead "<font color="#ff0000">cd /usr/src/sys/SMS; make all; cp /unix /genunix; make install</font>" But don't reboot just yet. Oh, and only do the cp if you've not installed a kernel before. This will be your backup to boot if you install a bad kernel, and it's best to never change that.</font></div><div><br /></div><div>This is the issue, I think, that I'm running into with the kernel reconstruction for my as released project.</div><div style="text-align: left;"><div><font face="courier"></font></div></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><font face="courier"></font></div></div></blockquote><div><h2 style="text-align: left;"><font face="inherit">2.11BSD Network Configuration</font></h2><div>Edit /etc/netstart. You'll need to fill in these lines:</div><div><div><font face="courier"></font></div><blockquote><div><font face="courier">hostname=my.domain.name</font></div><div><font face="courier">netmask=255.255.255.0</font></div><div><font face="courier">broadcast=127.255.255.255</font></div><div><font face="courier">default=127.0.0.0</font></div></blockquote><div><font face="inherit">as appropriate. I leave the default route alone, since I don't want this machine on the internet. You'll also need to uncomment out the qe0 line and change </font>192.26.147.13 to the IP address for this machine. Then, when you reboot, you'll be able to get to the machine.</div><div><br /></div><div>You may want to populate /etc/hosts. And maybe /etc/networks. Following the documentation for 4.2BSD or 4.3BSD network configuration will get the job done.</div><h2 style="text-align: left;">Create a user</h2><div>Since you don't want to login as root, create a user using vipw. The sms account can be used as a template for what to do. You'll want to add this user to the 'wheel' group in /etc/group. You'll also want to make a home directory, chown it to this user, populate dot files, etc. And you'll likely want to set a password, but since you are using telnet, the password will be transmitted in the clear, so don't use a valuable one.</div><div><br /></div><div>If you really do want to login as root, mark the PTYs as secure in /etc/ttys. You'll likely not want to do this. But it's a useful hack if you forgot to start simh in a 'screen' session and you want to hack as root from another room. OK for the short term, but you really don't want to leave it in this state.</div><h2 style="text-align: left;">Reboot</h2><div>Use halt to halt 2.11BSD and get back to the simh> prompt. Type boot rq0 and hit return at the : prompt. hit ^D at the # prompt for single user and then login. ifconfig qe0 should show everything configured correctly. ftp and telnet are configured by default, for better or worse.</div><div><font face="courier"></font></div></div><div></div></div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com2tag:blogger.com,1999:blog-32797070.post-73289999203885531602020-07-19T21:11:00.001-06:002020-07-20T17:15:55.612-06:00SIMH Setup for 2.11BSD restoration project<h1 style="text-align: left;">SIMH Setup for 2.11BSD pl 0 Project</h1><div>So, you'd like to do more than just follow along with my 2.11bsd as released project. You'd like to see if you can recreate the work I've done. So I've written up the setup I'm using in the hopes that it will be helpful to others. There's many other tutorials on how to do this generically, but there's some special needs for this project not adequately covered elsewhere. I've written up the instructions you'll need to manually install, as well as provided a script at the end of the blog to do the same if you are impatient and jump right in.</div><div><br /></div><div>Please note: this bootstraps 2.11BSD pl 195. This is an older version of 2.11BSD that has different installation procedures than latter-day installation versions and should only be used for that version. Even 2.11BSD pl 0 willl have slightly different instructions since the disk partitioning scheme changed in patch 78 which changed the name of the /usr partition.</div><h2 style="text-align: left;">Machine Configuration</h2><div>I've configured SIMH emulated the machine like so:</div><div><ol style="text-align: left;"><li>PDP-11/93</li><li>4MB RAM</li><li>2 RD54 disk drives</li><li>1 TS11 tape drive</li><li>Serial Console</li></ol><div>I've not taken the time to configure the network. All data transfer is done via the tape drive. It's way faster. Here's a <a href="http://www-users.med.cornell.edu/~jdvicto/nycpdp93.html">picture of </a>what real hardware for this configuration would look like, more or less. The tape drive on top isn't really a TS11 (it's something better: a Cipher drive that can do 6250bps, is front-loading, and likely a tms drive since it supports TMSCP, but pretend with me it's a ts device since that's the path I tested). </div></div><div><img height="398" src="http://www-users.med.cornell.edu/~jdvicto/pdp1193c.jpg" width="326" /></div><h2 style="text-align: left;">SIMH configuration</h2><blockquote><div>SET CPU 11/93, 4M</div><div>SET CPU IDLE</div><div><br /></div><div>SET RQ ENABLE</div><div>SET RQ0 ENABLE, RD54, WRITEENABLED</div><div>ATTACH RQ0 ./211bsd-195.rd54</div><div>SET RQ1 ENABLE, RD54, WRITEENABLED</div><div>ATTACH RQ1 ./extra-data.rd54</div><div><br /></div><div>SET TS ENABLE</div><div>SET TS0 CAPAC=0,LOCKED</div><div>ATTACH TS0 ./211bsd-195.tap</div><div>; ATTACH TS0 ./src.tap</div><div>SET DLI ENABLE</div><div>SET DLO0 NODATASET,8B</div><div>SHOW DLO0</div><div>set console pchar=01000023600 ; allow vi/more to work</div><div><br /></div><div>; echo "At the SimH prompt type: ra(0,0)unix"</div><div>; BOOT RQ0</div></blockquote><div>The rest of this document will assume the above configuration. Later I'll have you change it by commenting out or uncommenting lines. Save the above file to something like 2.11bsd-195.ini (the name I'll assume below). Or see the last section for a short cut.</div><h2 style="text-align: left;">Obtaining the 2.11BSDpl195 Tape</h2><div>This isn't as easy as it sounds. You can snag the raw bits from:</div><div><blockquote><a href="https://www.tuhs.org/Archive/Distributions/UCB/2.11BSD-pl195.tar">https://www.tuhs.org/Archive/Distributions/UCB/2.11BSD-pl195.tar</a></blockquote><div>But that's not a tape. It has all the parts to make a tape if you had a real PDP-11 with a tape drive. So we'll have to fake it. I hacked the canonical perl script to do it. You can find the results at</div><div><blockquote><a href="https://raw.githubusercontent.com/bsdimp/mk211bsd/master/195/mk211p195tape.pl">https://raw.githubusercontent.com/bsdimp/mk211bsd/master/195/mk211p195tape.pl</a></blockquote></div><div><div>so you'll need to fetch those two items and do the following:</div><div></div><font face="courier"></font><blockquote><font face="courier">% tar xf 2.11BSD-pl195.tar<br />% gunzip *.gz<br />% perl mk211p195tape.pl</font><div><font face="courier">bootstrap: 18432 bytes = 36 records (blocksize 512 bytes)</font></div><div><font face="courier">mkfs.bin: 30720 bytes = 30 records (blocksize 1024 bytes)</font></div><div><font face="courier">restor.bin: 35840 bytes = 35 records (blocksize 1024 bytes)</font></div><div><font face="courier">icheck.bin: 32768 bytes = 32 records (blocksize 1024 bytes)</font></div><div><font face="courier">root.dmp: 4126720 bytes = 403 records (blocksize 10240 bytes)</font></div><div><font face="courier">usr.tar: 28835840 bytes = 2816 records (blocksize 10240 bytes)</font></div><div><font face="courier">sys.tar: 5212160 bytes = 509 records (blocksize 10240 bytes)</font></div><div><font face="courier">src.tar: 40622080 bytes = 3967 records (blocksize 10240 bytes)</font></div></blockquote><div><font face="courier"></font></div><div> </div><div>which will give you the 211bsd-195.tap you need to do the install. That filename is hard coded in the perl script.</div><h2 style="text-align: left;">Following the Instructions?</h2><div>The pdf/ps files that are included with the patch 195 tape are for a newer version, so there's mistakes in them. The errors stem from disklabeling. It doesn't exist in 195, so you have to use old-school fixed partitions. You can read about the background on this in a <a href="http://bsdimp.blogspot.com/2020/07/old-school-disk-partitioning.html">previous blog entry</a>. But see below for a twist with the RD54 disks i'm using...</div><div><br /></div><div>On newer versions, the first file on the tape is disklabel, followed by mkfs, etc. On this older one, there is no disklabel, so the first file is mkfs, etc. This makes all the other fielding off by one in the instructions. This blog, however has the numbers right. It also makes this blog not completely useful for the newest version without adjusting...</div><h2 style="text-align: left;">A Word on Device Names in Bootloader</h2><div>Device Names in the boot loader and stand alone programs are different than normal in unix. They used to be common, but now are unfamiliar to many, even for sysadmin. They are of the form xx(u, s, extra)file.</div><div><br /></div><div>The "xx" is the name of the device. Two names will be important for us. The tape is "ts" and the disk is "ra".</div><div><br /></div><div>The "u" is the unit number. It is basically the same as today, but with some weird rules if you have more than one controller. In this install everything will be unit 0, even though we have two disks. The second disk is for the recovery and will only be used inside unix.</div><div><br /></div><div>The "s" is for subunit. For tape drives, it is the file number on the tape, starting at 1. For those that might not know, a tape has a series of records on it. These records are separated by end of file marks. There is also an end of tape mark. Both unix and the stand alone programs present this to the user as a series of files. To read a file, you need to know it's location and record size (hence specifying them when we made the tape above.</div><div><br /></div><div>For disk drives "s" is the partition. Since this version doesn't yet have disklabels, we are using the standard rd54 partition scheme shown below. We will use it for both disks so that the scratch disk will become a bootable drive when we are done. "file" is the path to the file to boot. It's only meaningful for disks.</div><div><br /></div><div>Finally, the ",extra" is optional for when devices are at non-standard addresses, so we won't use them. For those that must know, it is the CSR of the controller.</div><h2 style="text-align: left;">Installing with SIMH</h2><div>Use your favorite package manager to install simh. This will work with most of the recent versions of simh, so the specific version is unlikely to matter. Put the two files in the same directory. We'll be booting a number of times. The outline of what you'll be doing:</div><div><ol style="text-align: left;"><li>Booting off tape into mkfs to create the door filesystem.</li><li>Booting again off tape into restor to populate the filesystem.</li><li>Booting again, this time off disk, to restore /usr and configure the system.</li><li>Rebooting to make sure it is all setup right. </li></ol></div><div>Once we are done, the system will be setup how it needs to be to build everything. That stuff will be in a separate blog entry, since it's too long to include with this one.</div><div><br /></div><div>Alternatively, you could run the expect script that does the rest of this blog for you.</div><h3 style="text-align: left;">Mkfs Boot</h3><div>This one is very simple and straight forward. Here and below user input is in <font color="#ff0000">red</font>. And <font color="#ff0000"><cr> </font>means carriage return (or just hit the return key).</div><div><div></div></div><blockquote><div><div><font face="courier">% <font color="#ff0000">pdp11 211bsd-195.ini</font></font></div><div><font face="courier"><br /></font></div><div><font face="courier">PDP-11 simulator V3.9-0</font></div><div><font face="courier">Disabling CR</font></div><div><font face="courier">Disabling RK</font></div><div><font face="courier">Disabling HK</font></div><div><font face="courier">Disabling TM</font></div><div><font face="courier">RQ: creating new file</font></div><div><font face="courier">RQ: creating new file</font></div><div><font face="courier">DLO0, 8b, no dataset, no logging</font></div><div><font face="courier">sim> <font color="#ff0000">boot ts</font></font></div></div><div><div><font face="courier">93Boot from ts(0,0,0172522)</font></div><div><font face="courier">: <font color="#ff0000">ts(0,1)</font></font></div><div><font face="courier">Boot: bootdev=01000 bootcsr=0172522</font></div><div><font face="courier">Mkfs</font></div><div><font face="courier">file system: <font color="#ff0000">ra(0,0)</font></font></div><div><font face="courier">file sys size: <font color="#ff0000">15884</font></font></div><div><font face="courier">interleaving factor (m; 5 default): <font color="#ff0000"><cr></font></font></div><div><font face="courier">interleaving modulus (n; 100 default): <font color="#ff0000"><cr></font></font></div><div><font face="courier">isize = 10160</font></div><div><font face="courier">m/n = 5 100</font></div><div><font face="courier">Exit called</font></div><div><font face="courier"><br /></font></div><div><font face="courier">93Boot from ts(0,0,0172522)</font></div><div><font face="courier">:</font></div></div></blockquote><h3 style="text-align: left;">The restor boot</h3><p style="text-align: left;">Directly at the : prompt above, you should continue with the installation. The restor program takes the image on the tape and creates /.</p><div></div><blockquote><div><font face="courier">93Boot from ts(0,0,0172522)</font></div><div><font face="courier">: <font color="#ff0000">ts(0,2)</font></font></div><div><font face="courier">Boot: bootdev=01000 bootcsr=0172522</font></div><div><font face="courier">Restor</font></div><div><font face="courier">Tape? <font color="#ff0000">ts(0,4)</font></font></div><div><font face="courier">Disk? <font color="#ff0000">ra(0,0)</font></font></div><div><font face="courier">Last chance before scribbling on disk. </font><span style="color: red; font-family: courier;"><cr></span><span style="font-family: courier;">End of tape</span><font color="#ff0000" style="font-family: courier;"> </font></div><div><font color="#ff0000" face="courier"><br /></font></div><div><div><font face="courier">93Boot from ts(0,0,0172522)</font></div></div><div><font face="courier">: </font></div></blockquote><h3 style="text-align: left;">Boot Unix</h3><div>You should now be able top boot unix from the loader prompt. Note: there's no boot loader yet on the ra disk, so you can't boot off of 'RQ0' in simh just yet should you need to restart.</div><div><span style="font-family: courier;"></span></div><blockquote><div><span style="font-family: courier;">93Boot from ts(0,0,0172522)</span></div><div><span style="font-family: courier;">: <font color="#ff0000">ra(0,0)unix</font></span></div><div><span style="font-family: courier;">Boot: bootdev=02400 bootcsr=0172150</span></div><div><span style="font-family: courier;"><br /></span></div><div><span style="font-family: courier;">2.11 BSD UNIX #29: Tue Jul 12 19:51:16 PDT 1994</span></div><div><span style="font-family: courier;"> sms1@sms.iipo.gtegsc.com:/usr/src/sys/GENERIC</span></div><div><span style="font-family: courier;"><br /></span></div><div><span style="font-family: courier;">ra0: RD54 size=311200 id: 40362564</span></div><div><span style="font-family: courier;">ra0: type 2 partitions</span></div><div><span style="font-family: courier;"><br /></span></div><div><span style="font-family: courier;">phys mem = 4186112</span></div><div><span style="font-family: courier;">avail mem = 4002240</span></div><div><span style="font-family: courier;">user mem = 307200</span></div><div><span style="font-family: courier;"><br /></span></div><div><span style="font-family: courier;">Jul 18 09:59:12 init: configure system</span></div><div><span style="font-family: courier;">hk ? csr 177440 vector 210 skipped: No CSR.</span></div><div><span style="font-family: courier;">ht ? csr 172440 vector 224 skipped: No CSR.</span></div><div><span style="font-family: courier;">ra 0 csr 172150 vector 154 vectorset attached</span></div><div><span style="font-family: courier;">rl 0 csr 174400 vector 160 attached</span></div><div><span style="font-family: courier;">tm ? csr 172520 vector 224 does not exist.</span></div><div><span style="font-family: courier;">tms 0 csr 174500 vector 260 vectorset attached</span></div><div><span style="font-family: courier;">ts 0 csr 172520 vector 224 attached</span></div><div><span style="font-family: courier;">xp 0 csr 176700 vector 254 attached</span></div><div><span style="font-family: courier;">erase, kill ^U, intr ^C</span></div><div><span style="font-family: courier;"># </span></div></blockquote><div>you should now be ready to install boot blocks and restore /usr and other filesystem(s), and configuring the system. Looking at the manual for ra(4), we find the RD54 has the following partitions;</div><div><div><font face="courier"></font></div></div><blockquote><div><div><font face="courier"> disk start end length comments</font></div><div><font face="courier"> ra?a 0 15883 15884 /</font></div><div><font face="courier"> ra?b 15884 32603 16720 swap</font></div><div><font face="courier"> ra?c 32604 331167 298564 /usr</font></div><div><font face="courier"> ra?d unused</font></div><div><font face="courier"> ra?e unused</font></div><div><font face="courier"> ra?f unused</font></div><div><font face="courier"> ra?g unused</font></div><div><font face="courier"> ra?h 0 331167 331168 whole disk</font></div></div><div></div></blockquote><div>so we'll just need to create the /usr partition. However, turns out that the man page is wrong. This doesn't quite match the source to ra.c, nor does it quite match the disktab entry which says:</div><div><div><font face="courier"></font></div><blockquote><div><font face="courier">rd54|RD54|DEC RD54:\</font></div><div><font face="courier"> :ty=winchester:ns#17:nt#15:nc#1221:so:\</font></div><div><font face="courier"> :b0=/mdec/rauboot:\</font></div><div><font face="courier"> :pa#15884:ba#1024:fa#1024:\</font></div><div><font face="courier"> :pb#16720:bb#1024:fb#1024:\</font></div><div><font face="courier"> :pc#311200:bc#1024:fc#1024:\</font></div><div><font face="courier"> :pg#278596:bg#1024:fg#1024:</font></div></blockquote><div>which I'll admit is a little hard to read. I misread it the first time. pX is the length of the X partition. The entire disk is 311200 blocks long, so the pc entry clearly is for that. The pg entry is what we want, since pa is for / and pb is for swap and if you add pa+pb+pg you get 311200. If, however, you look at the disktab from the initial revision of 2.11BSD (at least what I think it is), it matches the manual. So we're going to have to be careful when we boot the ur2.11BSD kernel once we get to that point (which we will in the 2.11BSD as released project, but won't in the rest of the installing 2.11BSDpl195). This mismatch, btw, is one of the many motivating factors for disk labels. Patch 78, btw, changed this without updating the man page. Fortunately, the only change for us if we wish to go backwards from 195 to 0 is to change the ra0g to ra0c in the /etc/fstab... but this digression has gone on too long...</div><h2 style="text-align: left;">Extract /usr, sources and minor config</h2><div>Once we've booted to unix, we use a fairly familiar unix to extract things. The rest of the installation goes as follows</div><div><ol style="text-align: left;"><li>Install new boot blocks</li><li>Fix /dev/mt entries to match the TS-11 we have</li><li>newfs and mount /usr (on /dev/ra0g)</li><li>extract binaries from file 4, kernel/include src from file 5, and sources from file 6</li><li>move sendmail out of the way so it doesn't hang the boot</li><li>add /usr to the fstab</li></ol><div>Here's the exact commands to do all that:</div></div><div><div><font face="courier"></font></div><blockquote><div><font face="courier"># <font color="#ff0000">dd if=/mdec/rauboot of=/dev/ra0a count=1</font></font></div><div><font face="courier">1+0 records in</font></div><div><font face="courier">1+0 records out</font></div><div><font face="courier"># <font color="#ff0000">cd /dev</font></font></div><div><font face="courier"># <font color="#ff0000">rm *mt*</font></font></div><div><font face="courier"># <font color="#ff0000">./MAKEDEV ts0</font></font></div><div><span style="font-family: courier;"># <font color="#ff0000">cd /</font></span></div><div><font face="courier"># <font color="#ff0000">newfs ra0g rd54</font></font></div><div><font face="courier">newfs: /etc/mkfs /dev/rra0g 139298 2 127</font></div><div><font face="courier">isize = 65488</font></div><div><font face="courier">m/n = 2 127</font></div><div><font face="courier"># <font color="#ff0000">mount /dev/ra0g /usr</font></font></div><div><font face="courier"># <font color="#ff0000">cd /usr</font></font></div><div><font face="courier"># <font color="#ff0000">mt -f /dev/rmt12 rew</font></font></div><div><font face="courier"># <font color="#ff0000">mt -f /dev/rmt12 fsf 5</font></font></div><div><span style="font-family: courier;"># <font color="#ff0000">tar xpbf 20 /dev/rmt12</font></span></div><div><font face="courier"># <font color="#ff0000">cd /</font></font></div><div><font face="courier"># <font color="#ff0000">rm -f sys</font></font></div><div><font face="courier"># <font color="#ff0000">ln -s usr/src/sys sys</font></font></div><div><font face="courier"># <font color="#ff0000">cd /usr</font></font></div><div><font face="courier"># <font color="#ff0000">mkdir src</font></font></div><div><font face="courier"># <font color="#ff0000">cd src</font></font></div><div><span style="font-family: courier;"># <font color="#ff0000">mt -f /dev/rmt12 rew</font></span></div><div><font face="courier"># <font color="#ff0000">mt -f /dev/rmt12 fsf 6</font></font></div><div><font face="courier"># <font color="#ff0000">tar xpbf 20 /dev/rmt12</font></font></div><div><font face="courier"># <font color="#ff0000">mt -f /dev/rmt12 rew</font></font></div><div><font face="courier"># <font color="#ff0000">mt -f /dev/rmt12 fsf 7</font></font></div><div><font face="courier"># <font color="#ff0000">tar xpbf 20 /dev/rmt12</font></font></div><div><font face="courier"># <font color="#ff0000">mv /usr/lib/sendmail /usr/lib/sendmail.off</font></font></div><div><font face="courier"># <font color="#ff0000">chmod 755 / /usr /usr/src /usr/src/sys</font></font></div><div><font face="courier"># <font color="#ff0000">echo /dev/ra0g:/usr:rw:1:2 >> /etc/fstab</font></font></div><div><font face="courier"># <font color="#ff0000">halt</font></font></div><div><font face="courier">syncing disks... done</font></div><div><font face="courier">halting</font></div><div><font face="courier"><br /></font></div><div><font face="courier">HALT instruction, PC: 000014 (MOV #1,13710)</font></div><div><font face="courier">sim> <font color="#ff0000">quit</font></font></div></blockquote><div>and now you have a full system. </div><div><br /></div><h2 style="text-align: left;">Running 2.11BSD</h2><div>You can now comment out the first ATTACH TS0 line and uncomment out the second. You can uncomment the last two lines, now when you run pdp11, you'll get output that looks like:</div><div><font face="courier"></font></div><blockquote><div><font face="courier">% <font color="#ff0000">pdp11 211bsd-195.ini</font></font></div><div><font face="courier"><br /></font></div><div><font face="courier">PDP-11 simulator V3.9-0</font></div><div><font face="courier">Disabling CR</font></div><div><font face="courier">Disabling RK</font></div><div><font face="courier">Disabling HK</font></div><div><font face="courier">Disabling TM</font></div><div><font face="courier">DLO0, 8b, no dataset, no logging</font></div><div><font face="courier">"At the SimH prompt type: ra(0,0)unix"</font></div><div><font face="courier"><br /></font></div><div><font face="courier">93Boot from ra(0,0,0172150)</font></div><div><font face="courier">: <font color="#ff0000"><cr></font></font></div><div><font face="courier">: ra(0,0)unix</font></div><div><font face="courier">Boot: bootdev=02400 bootcsr=0172150</font></div><div><font face="courier"><br /></font></div><div><font face="courier">2.11 BSD UNIX #29: Tue Jul 12 19:51:16 PDT 1994</font></div><div><font face="courier"> sms1@sms.iipo.gtegsc.com:/usr/src/sys/GENERIC</font></div><div><font face="courier"><br /></font></div><div><font face="courier">ra0: RD54 size=311200 id: 40362564</font></div><div><font face="courier">ra0: type 2 partitions</font></div><div><font face="courier"><br /></font></div><div><font face="courier">phys mem = 4186112</font></div><div><font face="courier">avail mem = 4002240</font></div><div><font face="courier">user mem = 307200</font></div><div><font face="courier"><br /></font></div><div><font face="courier">Jul 19 10:04:46 init: configure system</font></div><div><font face="courier">hk ? csr 177440 vector 210 skipped: No CSR.</font></div><div><font face="courier">ht ? csr 172440 vector 224 skipped: No CSR.</font></div><div><font face="courier">ra 0 csr 172150 vector 154 vectorset attached</font></div><div><font face="courier">rl 0 csr 174400 vector 160 attached</font></div><div><font face="courier">tm ? csr 172520 vector 224 does not exist.</font></div><div><font face="courier">tms 0 csr 174500 vector 260 vectorset attached</font></div><div><font face="courier">ts 0 csr 172520 vector 224 attached</font></div><div><font face="courier">xp 0 csr 176700 vector 254 attached</font></div><div><font face="courier">erase, kill ^U, intr ^C</font></div><div><font face="courier"># </font></div></blockquote><div>and you have a new system. ^D at the # prompt above gets you to the login: prompt.</div><div><font face="courier"></font></div><blockquote><div><font face="courier"># <font color="#ff0000">^D </font>Fast boot ... skipping disk checks</font></div><div><font face="courier">checking quotas: done.</font></div><div><font face="courier">Assuming non-networking system ...</font></div><div><font face="courier">usage: hostid [hexnum or internet address]</font></div><div><font face="courier">preserving editor files</font></div><div><font face="courier">clearing /tmp</font></div><div><font face="courier">standard daemons: update cron accounting.</font></div><div><font face="courier">starting lpd</font></div><div><font face="courier">starting local daemons:.</font></div><div><font face="courier">Sun Jul 19 10:06:06 PDT 2020</font></div><div><font face="courier"><br /></font></div><div><font face="courier"><br /></font></div><div><font face="courier">2.11 BSD UNIX (my.domain.name) (console)</font></div><div><font face="courier"><br /></font></div><div><font face="courier">login: <font color="#ff0000">root</font></font></div><div><font face="courier">Last login: Sun Jul 19 06:15:39 on console</font></div><div><font face="courier">2.11 BSD UNIX #29: Tue Jul 12 19:51:16 PDT 1994</font></div><div><font face="courier">[1] root--> <font color="#ff0000">df</font></font></div><div><font face="courier">Filesystem kbytes used avail capacity Mounted on</font></div><div><font face="courier">/dev/ra0a 15247 3504 11743 23% /</font></div><div><font face="courier">/dev/ra0g 135203 73761 61442 55% /usr</font></div><div><font face="courier">[2] root--> </font></div></blockquote><div>And now you have a 2.11BSD patchlevel 195 that you can use to run my bootstrap scripts.</div><h2 style="text-align: left;">Shortcut All of the Above</h2><p style="text-align: left;">Or, you can shortcut all this stuff. As I've said above, I've written an expect script that will do all the tedious typing above. While all this typing recalls the manual nature of Unix installations in a by-gone day, it's rather a pain to do more than once. So i automated it. Just clone my mk211bsd github repo, fetch the tape and run the expect script and all this will happen for you. Since the output is the same, i've not included in these instructions.</p><div><font face="courier"></font></div><blockquote><div><font face="courier">% mkdir mk211bsd</font></div><div><font face="courier">% github clone https://github.com/bsdimp/mk211bsd</font></div><div><font face="courier">% cd mk211bsd/195</font></div><div><font face="courier">% wget <a href="https://www.tuhs.org/Archive/Distributions/UCB/2.11BSD-pl195.tar">https://www.tuhs.org/Archive/Distributions/UCB/2.11BSD-pl195.tar</a></font></div><div><font face="courier">% tar xvf 2.11BSD-pl195.tar</font></div><div><font face="courier">% unzip *.gz</font></div><div><font face="courier">% perl mk211p195tape.pl</font></div><div><font face="courier">% expect 211bsd-195.expect</font></div></blockquote><div><font face="courier"></font></div><div><font face="inherit">And you'll be able to skip directly to the "Running 2.11BSD" section since the expect script should do all the typing for you. I've run this script about a dozen times now, and think I have all the kinks worked out. This will give anybody that wants to help out with my 2.11BSD as released project the same setup that I'm using to bootstrap a 2.11BSD pl 0 userland. I'll describe how to do that in a future blog.</font></div><h2 style="text-align: left;"><font face="inherit">Just Following Along</font></h2><div><font face="inherit">I'll blog about my big progress, and tweet about my small. I'm <a href="https://twitter.com/bsdimp">@bsdimp</a> on Twitter.</font></div><div><font face="courier"></font></div><div><font face="courier"></font></div><div><font face="courier"></font></div></div><div><font face="courier"></font></div></div><div><span style="font-family: courier;"></span></div><div></div><a href="https://people.freebsd.org/~imp/mk211p195tape.pl"></a></div></div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com7tag:blogger.com,1999:blog-32797070.post-13861253345990993312020-07-16T12:37:00.002-06:002020-07-16T13:22:35.813-06:00Traditional Unix Toolchains<h1 style="text-align: left;">Traditional Unix Toolchains</h1><div>Older Unix systems tend to be fairly uniform in how they handle the so-called 'toolchain' for creating binaries. This blog will give a quick overview of the toolchain pipeline for Unix systems that follow the V7 tradition (which evolved along with Unix, a topic for a separate blog maybe).</div><div><br /></div><div>Unix is a pipeline based system, either physically or logically. One program takes input, process the data and produces output. The input and output have some interface they obey, usually text-based. The Unix toolchain is no different.</div><div><br /></div><h2 style="text-align: left;">Overview</h2><div>Here's a simplified view of what's going on. We'll add more detail later.</div><div><img src="https://graphs.grevian.org/graph/images/5666945753939968" /></div><div>In this view, the C compiler takes .c code and turns it into assembler. How it does that, and how it optimizes, etc is for another blog post. Once the assembler is created, it's passed to as(1) which translates the assembler into .o files. The .o files contain the binary representation fo the assembler, plus a lot of metadata about it: what addresses correspond to what symbols, how to relocate the raw assembler when connected together, various debugging information (sometimes) and what section each bit of data resides in. You cannot directly execute a .o file. ld takes all the .o files and produces an executable (the default name of which is a.out). a.out files are executable. They happen to be in the same format as the .o files, except they have a different magic number which tells the kernel how to load them into memory and initialize the CPU's registers for that program.</div><h2 style="text-align: left;">Program Layout</h2><div>In traditional unix, there were only three sections to a program. There were no shared libraries or other fancy things done by the linker (such as linker sets). The world view was much simpler. There were three sections, each one had a size. There was the 'text' section. This was the executable code. There was the 'data' section, which contained initialized data. And there was the 'bss' section which also contained data that was initialized to 0. </div><div><img src="https://graphs.grevian.org/graph/images/5672348394979328" /></div><div>The heap resides above the bss and is managed by the unix sbrk(2) system call. The so-called "break" is set to the end of the bss segment (often referred to by the symbol ebss). Malloc(3) is built on top of sbrk(2) and will manage returning bits to the OS when it can.</div><div><br /></div><div>For the PDP-11 and other segmented architectures, there can be complications. There can be separate I&D space (instruction and data) so that each one resides in it's own address space. This helps PDP-11 programs break the 64k limit. In addition, there can be overlays. Overlays are 8k segments that are mapped into the address space as needed to increase the text size of the program. The linker handles much of this, but the programmer must specify the overlap groups. Each group can be no more than 8k in size, and the main program can be no more than 56k in size (and the overlay manager uses 8k of the data segment as well). Programs in unix tend to not use overlays, but the kernel makes heavy use of them.</div><h2 style="text-align: left;">Compiler (cc, f77, etc)</h2><div>Compilers create assembler output. Compilers, like the C compiler, may invoke other programs to do this. The C compiler runs the source through cpp to create an intermediate file (.i files) that it runs through the first pass of the C compiler. There are a number of other passes of the compiler that take the initial output and optimize it in various ways (usually by parsing and rewriting assembler). The final output of the compilers, at least in this era, is always textual assembler.</div><h2 style="text-align: left;">Assembler (as)</h2><div>The assembler is the only thing in the system that creates .o files. Well, not strictly true since ld can also take .o files and produce a .o file from it, but true enough. The assemble takes the textual assembler and creates a .o file from that. The .o file includes information about how to relocate it (ld uses this info), what symbols go where, what bits are in the text section, what is in the data, etc.</div><h2 style="text-align: left;">Archive Files (ar)</h2><div>It's fairly expensive to open a lot of files on Unix, especially if they are small. It's also inconvenient to carry around a number of different files to implement something. So unix ld also supports reading files in from an archive. An archive adds some headers to describe the file and then places a copy of the file into the archive. Unix has had a number of different archive formats (I could do a mini-blog entry on all of the ones through 4BSD), but conceptually they are all the same. The ar(1) program is used to create and manage .a files for this purpose.</div><div><br /></div><div>One motivation for the library is to save space. If it's efficient to create a lot of tiny .o files, then the loader can only bring in what's needed saving space. When the address space is only 64k (or 64k+64k for separate I&D machines), every little bit helps. The archiver removes the overhead of having to do directory lookups on hundreds of files by creating a container for those objects that ld doesn't have to process by name.</div><div><br /></div><div>When processing through a library, ld looks at each .o that's in the archive for symbols and includes it if it finds any that are needed for the current image so far. It just does one pass through an archive, though. This means if you have foo.o and bar.o in the archive and foo.o depends on bar.o somehow, foo.o needs to come first so that ld can find bar.o later. If they are in the other order, then ld may pass over bar.o entirely and then when it is processing foo.o, it will not go back and look for it.</div><div><br /></div><div>lorder(1) and tsort(1) are used to try to optimize the order of the .o's in the library to make it possible to just do one pass through the library (though when you have circular dependencies, you're back to this same issue). lorder uses nm(1) to read all the .o's on the command line and produce dependencies. tsort takes these dependencies and sorts them into a list in the proper dependency order where possible. When cycles exist, it produces an order that minimizes passes required to resolve them all.</div><div><br /></div><div>That sounds quite inconvenient, and it is. libc.a, especially in newer versions, has a number of circular dependencies that a single pass fails to resolve. One can work around this issue by specifying libc multiple times (which is unsatisfying, even if it doesn't produce a binary with two copies of everything), or do something else. The something else involves adding a table of contents to the library. A program called ranlib will read through an archive creating an index of defined symbols that points to the offset in the file that he .o with that symbol is present at. It does this by creating a first member of the archive named __.SYMDEF and placing its table in there. The format of the table is something that ranlib and ld agree on. ld uses this table to include files that are needed and to be able to seek backwards easily. In effect, this is the same as ld doing two passes over an archive (one to build this index, and one to process it), but in effect precomputes the first pass to keep ld simpler.</div><h2 style="text-align: left;">Loader (ld)</h2><div>The linker can operate in two different modes. The first mode most people are not familiar with. In this mode, it will take .o files and partially link them together to produce a new .o file. libc uses this mode of operation to create all the assembler glue to call system calls and optimize out some of the local labels that the assembler produces and expects ld to optimize away. Since these files are consulted so often, the build process of libc does it at build time so that every invocation of ld later can be faster.</div><div><br /></div><div>The second mode is the mode people are more familiar with. In this mode, ld combines a number of .o and .a files to create an executable (a.out by default, so that's what people call executables in general). a.out binaries lacked shared libraries, so ld produced the final output. This was both good and bad. It wasted space with all those copies of libc, but it also produced self-contained binaries that didn't need any external libraries to work. The PDP-11 didn't really have good demand paging hardware, like the later VAX machines, so was a poor fit to shared libraries. Shared libraries generally rely on mmap(2) working and larger address spaces to map the libraries in at. mmap(2) requires a page-grained MMU, which didn't usefully exist on the PDP-11 (it had 8k segments, which was far to large a percent of the whole address space to be useful). One good thing about binaries being self contained means that if the kernel can run the system calls that are in it, the binary will work. This has allowed PWB systems to be able to execute both v6 and v7 binaries, despite the two having different system call interfaces.</div><h2 style="text-align: left;">The Kernel</h2><div>Speaking of the kernel, the kernel is the last step in the toolchain, or can be thought of as such. The kernel reads in the headers from the a.out files, and sets up the address space for the process when a new a.out binary is exec'd. It uses the layout I showed above, or some variant of it, to set things up, to populate memory and makes whatever arrangements with the MMU to protect the pages from other processes (if possible, some systems like an 8086 don't have MMUs but do have segments so can fake all this except the memory protection benefits). For separate I&D space binaries, it also sets up the segment registers for that to work.</div><div><br /></div><div>The stack is also initialized. The detail of exactly where it goes varies somewhat. It's usually located with the data segment since it holds data almost exclusively. Stacks in this era were usually quite small. This tended to drive programs that had shallow call graphs and that made use of more global variables than a more modern style would suggest. All these things conserved stack space, though it's generally agreed today that it required more effort to read and understand because the context is spread out over more parts of the program than more modern coding practices tend to produce.</div><h2 style="text-align: left;">Conclusion</h2><div>Without the complications of shared libraries, or link time optimizations, the tools of this area tended to be rather simple. They had simple interfaces between them. There were good boundaries between the different components. This limited the number of programs with knowledge of the formats for the different layers. Due to this limited spread of knowledge, switching out different parts for other parts often could be done without changing components that didn't directly know about the object format. This also produced simpler programs that used different engineering tricks to get the most performance out of the limited hardware of the day. The PDP-11s were approximately 0.1-0.5MIPS machines in this time frame with super slow I/O paths. This is about 100,000 times slower than most computers people interact with today. One advantage of the thoughtful engineering trade offs is that all the pieces are relatively easy to understand.</div><div><br /></div><div>The modern ecosystems that we have today are more complex. ELF came along in the 90s and obsoleted the text, data, bss world view. shared libraries made huge programs, like X11, feasible. Today, clang bypasses the separate assembler stage and generates .o files directly. The llvm linker, lld, can optimize binaries between modules to produce better code. All these new features added complication to a simple model. While I morn for the loss of simplicity, I've become too used to the rich features they provide to want to go back. Understanding the roots of this complexity, though, helps to understand some of the weird quirks that persist, even to this day.</div><div><br /></div><div>And speaking of weird quirks, I'd like to end with 'bss'. It's a 1950s IBM assembler mnemonic for 'block started by symbol' and was used to create storage that was associated with a symbol, but had no initial value. Today, 'bss' is no longer that, exactly. Its origin has been lost, for most people, in the sands of time and now it just means 'zeroed storage area'. So this very Unix centric term actually predates Unix by 10 or 15 years for a machine that Unix wouldn't run on until it was 10 or 15 years old... Here's a snapshot from the IBM assembler manual, available from the <a href="https://en.wikipedia.org/wiki/Symbolic_Assembly_Program">UA-SAP wikipedia page</a></div><div><img alt="" height="274" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAxQAAAFWCAYAAADwjNvfAAAgAElEQVR4AeydB7gVRdL33+97dwUEAUEykhRUkiiIIEExIUYwoZjjmgVEMSygoGIAXBWXFQwooK5xzeKrgIAR9TUhC4uYEBMK5mx/z6936359h5npPvfMOZx7qXmec+fcMz3d1f+qrq6qrp75r19//dVsSMdzzz1njj76aHPNNdeYb775Jq+uf/jhh+bkk082Bx10kBk0aJBZsmSJ2dDwzAtAvVkRUAQUAUVAEVAEFAFFoNIj8F8bmgH8ySefWCfgyCOPNF988UVeDPz+++/Nww8/bG6//XbTpEkTM3fuXPPzzz/nVaferAgoAoqAIqAIKAKKgCKgCFQmBDJxKH755Rfz448/mh9++MH89NNPFY7SUw/3U5d8fvvtN4snjo9cE6Oda/Kbe6/8Rjk+1MX5999/t3Vdd9115rjjjjOfffaZvZ/y3C/XhYHSJv2ijrgyUnarrbZSh0LA0LMioAgoAoqAIqAIKAKKwAaDQN4OBcb28OHDTdeuXU39+vVN3759zbRp08x3332XE4gY9aNGjTJ9+vQxTZs2NZ06dTJbbrmleeihh6wxf/fdd5sePXqYbbbZxpx99tlm7dq15vHHHze9evUy7du3N1dddZXZf//9TefOnc2+++5rGjRoYIYMGWKOOuoo07x5c3P44Yebzz//3NKEQ3HMMcfYtCdSlfr162dGjhxpVq5cacSBoV+TJ0+2bW622WZm6623Nuecc065Mm4H1aFw0dDvioAioAgoAoqAIqAIKAIbCgJ5OxQY9pdddpk1/FesWGFuueUW06pVK8P3aMQ/DdQ77rjDDBgwwCxbtsyuJuBItGnTxqYTYdx/++23ZsSIEdZ5eP311+0qCClHODN77bWXeeedd8y7775rmjVrZss99thjplGjRtbheOSRRwwG/7x582zdOBQNGzY02267rZkwYYKZOHGidYhwTj766CNLN84DTsSVV15pabrzzjutcwGNn3766TpdUYdiHUj0B0VAEVAEFAFFQBFQBBSBDQCBvB0K0oK+/vprM3/+fHPttdeaqVOnmhYtWhgMcByB0GP69Ol2pQDjn83NX375pXn77bfNmjVryhwTDHlWLWbOnGnrpl1WJLiHFQ4OnJnnn3/epifhIEyZMsWulhx44IHmxhtvtN9x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SGltisCGhYDqhorzWx2KimOX852//vqr+fnnn+3nl19+yfn+ynbDb7/9ZvtKv/M9GOSCHecsBv2HH35ofvjhh0zqyrd/xbjfxTAL/FyaRbbzketi8oP+Q3MWOEhd9D2L+lxco9+LiVEx24r2s9D/l2LfshhDcbghk6I7Cy2fce3n85tLe1Z6Px969N7Kj4BvnJWibqgsqKtDkQenEMyffvppnU+cUcVv99xzjzn99NPN4Ycfbq688krz9ddf59F66d/63HPPmaOPPtpcc8015ptvvsmLYAb5ySefbA466CAzaNAgs2TJEmsQVrTSr776ymy++ebmpptuMt9//31Fq6lU93388ccWw9NOO818+eWXmdJ+/fXXm0MPPdRcdtllFZLrYvKDMfv222+bv/71r+bNN980ceM1FBzuffnll82UKVPMhRdeaF577bW86ktr14cR+iifvrht+9pyy1a276Xat3zGUBrvCznuC837rPV+PvTGzff8pkflQiBtnJWabkgb16WIujoUeXDlvvvuM3vttZfp06eP6dGjh+ndu7f9fsUVV6xjQD/++OOmY8eOZtiwYYbrl19+uUF4q/LxySefWAP2yCOPNF988UVeXcXof/jhh83tt99umjRpYubOnWujbhWtlPpOOukks2DBgrzqqWj76+O+H3/80Tp37du3N6tWrcqUBAzpU0891QwcONB8/vnnOdddTH4ceOCBpl27dqZ27drmb3/7m/nuu+9yppcbWN266KKLTIMGDczxxx9vnQoMIFbmCnH4MJo1a5a59NJLM9ErvrYK0b9i1VmqfctnDKXxvpDjvtA8g1dZ6v186L3//vvNgAEDTM+ePc1OO+1k5/rbbrttgwlI5YNdKd2bNs5KTTekjetSwlRoUYdCkKjA+bPPPrOGLQpvs802M3/5y1/MY489ZlasWFEWPZe0n2OPPdaMGTPGGtYs3VY0skEEkgkCY4ZIaz71cD91yUcMIeqUa9DKwTX5DRrku5xlSZ263KXp6667zhx33HEGrCjLh/ujS+/SJv2ijrgywqKtttoqL4cC+qJ9lrrl7PbRV1buiZ4FM+qS/kX7L2UEZ3ARTIW38pvcK/RQb/SQdgRH4Yvg/eKLL5rtttvOfPDBB2UYpNWDgk3ih7QldN166612lSJXhyKNH7n0PYpF0v9gQ7277rqrmTZtWoUcCu6f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KQZcWHfCNTCw4MWzNbjDU2ik4EQgF3d46tatm28PZMIpwHDF2UqpG3Xgd127dvUMMEp5KBp5srpkjmAoW9b7mDz8JqXNsvLO+qyIdb11kb05rBgRWsbDFWkTdAonlQ3R5uRyFyxC1UJd4z0rDraql8KRfsLNA+g/tBu/p1y7IQFtj5526dLFl49hzWw9MlIez8xIaddUHUrp0yl9KJZPqjyhvnDjBpjDnvEnPGLlkbaS/sENEhiTeB4JeesQAREQAREQgWYjUBOHwqAQNsFMfmhM23epZ0IPCBHAsKkmn9TyqknHjC4GLPUmfKJ8BaM871rwYT8HD0mDDeWxkpO1yoFcGD2EfFXqtIRy41xhBFXbFrWSJ5St6H0tWNdaF8mv2vZI4Ujdefp2ll4UMWuv74o4VtKHivKpVHaca5xseOYdKeWl9g/KqaYf5smoz0VABERABESgEQjU1KFohApJBhEQAREQAREQAREQAREQgfoRkENRP9YqSQREQAREQAREQAREQASajoAciqZrUlVIBERABERABERABERABOpHQA5F/VirJBEQAREQAREQAREQARFoOgJyKJquSVUhERABERABERABERABEagfATkU9WOtkkRABERABERABERABESg6QjIoWi6JlWFREAEREAEREAEREAERKB+BORQ1I+1ShIBERABERABERABERCBpiMgh6LpmlQVEgEREAEREAEREAEREIH6EZBDUT/WKkkEREAEREAEREAEREAEmo6AHIqma1JVSAREQAREQAREQAREQATqR0AORf1YqyQREAEREAEREAEREAERaDoCciiarklVIREQAREQAREQAREQARGoHwE5FPVjrZJEQAREQAREQAREQAREoOkIyKFouiZVhURABERABERABERABESgfgTkUNSPtUoSAREQAREQAREQAREQgaYjIIei6ZpUFRIBERABERABERABERCB+hGQQ1E/1ipJBERABERABERABERABJqOgByKpmtSVUgEREAEREAEREAEREAE6kdADkX9WKskERABERABERABERABEWg6AnIomq5JVSEREAEREAEREAEREAERqB8BORT1Y62SREAEREAEREAEREAERKDpCMihaLomVYVEQAREQAREQAREQAREoH4E5FDUj7X77bff6ljaH7sosf5jt79qLwIiIAIiIAIiUD8Ccijqx9q9/fbb7vvvv29XxwJD+qeffiq9sgzrlDR1xNIuRdWDdbsInpNpo7fZL7/84nXu559/zqlB649//fVX/xt+q0MEREAEREAERKDjEpBD0ca2w8D78ccfc18YS+Hx5Zdfunnmmcddcskl7rvvvgu/qul7DOldd93Vbbzxxm7DDTd0L7zwgis32FLS1FSogsyQrZxjubwFP8/8ql6sMwtvpw8bqc2yqnjuuee6zTbbzJ1wwgnuq6++ykrS6rOHH37Ybbvttu7MM890X3/9davva/1BW3QtSxctHxx3c9hxpEyPs35T67ooPxEQAREQARFoJAJyKNrYGi+99JLbYIMNXP/+/d1KK63kVl555dJr0KBB7rHHHnPhbC1OxC677OIefPBBPyvbxmKjP6Ocm2++2V1xxRWuZ8+e7t57721VXkqaaEE1SnDDDTe4ddZZxw0YMMANHDjQMxw7dmxVTle9WNcIQVI2jdRmWQI/9dRTbo899vB94uOPP85K0uqzDz74wDu/W2+9tfv0009bfV/rD9qiaxdccIH7/PPPW4gyevRot/rqq3uH/Z133vFOxahRo9yQIUO8Hv/jH/9w33zzTYvf6B8REAEREAERaGYCcija2LqELuEcYLQfd9xx3oi/9dZb3W233eZWXHFFd/3117sffvjB585MJu95la9chCsdOCCWLnRGQhEtDeUzI1o0G7rIIotkOhRhfllpbAYWWZCdA7kpj8/yZAvzTX2P8YnTgzOx2267uZtuusm99957rTil5lfE2vJAfquL8S5vF0tbdLa2sJlq+588w/yMJ06B8bOZbePKby0dsvG/pSmXIavNLI3JUKQfVg5pkAf5rQ6Wj6XJkrk8jcl72WWX+VWKVIeCfM455xy3ww47uI8++qg0wx/W3eQwOfmNMTOWJk/sXKmuUTariv/+979b9LN3333XO09dunRxRxxxhGNF7JVXXnGnnnqqW2GFFdwzzzzTIn1MLn0vAiIgAiIgAh2dgByKKltw/vnndzgSGDfPPvusN4pGjBjhJk6c6D8j+5122sn169fPLbHEEu6BBx4oGel89/7777u11lrLz27imCy55JJu8cUXzwwdwQA84IAD3LLLLuu6devmVlllFXfxxRe7b7/9NrMWRYan/SArzfjx4/3Ky2KLLeb23Xdf98UXX3hHiZUYZDvllFNqHqKy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2KaRYCIgAiIgAiIgAiIgAiLQ+ATkUDR+G0lCERABERABERABERABEWhYAnIoGrZpJJgIiIAIiIAIiIAIiIAIND4BORSN30aSUAREQAREQAREQAREQAQaloAcioZtGgkmAiIgAiIgAiIgAiIgAo1PQA5F47eRJBQBERABERABERABERCBhiUgh6Jhm0aCiYAIiIAIiIAIiIAIiEDjE5BD0fhtJAlFQAREQAREQAREQAREoGEJyKFo2KaRYCIgAiIgAiIgAiIgAiLQ+ATkUDR+G0lCERABERABERABERABEWhYAnVxKH777Tf3008/lV783x5HWE57lVGt3L/88ovn8PPPP1eblWtLXr/++qsvn98201HLeoV6hN42qi41U/upLiIgAiIgAiIgAh2XQFUOBYbWjz/+2OKFAVZurL799ttu1113dRtvvLHbcMMN3QsvvNAqTS0Qfvzxx2733Xf3ZTz77LPtUka1cp577rlus802cyeccIL76quvqsquLXk9/PDDbtttt3Vnnnmm+/rrr6sqv5F+XMt61UtfU/ml9DMcqvK+GP4fOkXmfH3//ffuhx9+8L+rhYObWh+lEwEREAEREAERaC4CVTkUOAbrr7++69+/vxs0aJAbMmSI23vvvd24cePc559/XprZ/e6779zNN9/srrjiCtezZ0937733+lnyWqPEgLrlllvcvPPO626//XZvKNW6jGrze+qpp9wee+zhNthgA4cDVM3Rlrw++OAD79xtvfXW7tNPP62m+Ib6bS3rVS99TQWY0s/uvPNOt84665T64sorr+zste6665Z0DWd/woQJbptttvF9sXfv3q5fv341cXBT66N0IiACIiACIiACzUWgKoeCGc6rrrrKzTHHHO7KK690t956qzvjjDPc/PPP7x2LL774ohWtRRZZJNehwNjBKbCZU2ZNw5lVMitPY6FUYbqll17a3XHHHaUZW5uFDdO0EizjAysLA5M8QnnIy2aA+ZzvLU15VpYP6Ul72WWX+VWK0KGwNFllhflZuqK8wvRZ78855xy3ww47uI8++qhFHYyPlUF94MthM+B5dcwqxz6jzshrjDiTH0dKWfZbO1ubm3wmd6xeJo+VWaRnlrZIXy0N5VNHq5N9XqtzSj/DgceRn3XWWd3ll1/ubrvtNt8fcR66d+/u3nrrLS/O9ddf73AizOl/7LHHXN++fd3OO+/sPvvss1qJrHxEQAREQAREQAT+QASqcijgNHXqVL8iQJgIB8bVqFGj/Owos8blR56BhtF03nnn+RnW2WabzS266KLuwAMPdO+8807JUMOAPP/8892yyy7rZpppJkdeO+20k9t0001LM7CUZw4FBtJaa63l+vTp41ZffXWXJU+5fPY/RutFF13kVlhhBTfzzDO7+eabz+27775eHur4/vvv+7xZlTnuuOPckksu6RZffPFWM70YmqzMsCLBjPF+++3njj/+eLfJJpuUZI6VZTKl5GVpi84Y3tttt50PeyIEjToceuihJdbjx4/37bDYYov5OuMYYqCutNJKvo6nnHJKcrgUTsCRRx7p6z7nnHN6TgsuuKC76aabvIORUtbw4cPdUkst5YYOHeqN4y233NLPsM8999xuiy22KHGM1QsmKXoWssvT1zDN008/7euIQ42OtseR0s+mTZvmVx0449w888wz7ptvvnG0I/2IA/3DmcSZNUeMcDEmBEirQwREQAREQAREQAQqJVAzhwIjBoPk8ccfdwMHDnS77babD3sqFyjLQMOwwXnAiTj55JPdyy+/7GdQCaUijOPDDz/0xs9RRx3lZ1f3339/d99993lDHUOfEKf33nuvVBQOBQYwhtJyyy3njb1XX321oj0VGP0LLbSQu/jii33ed999t1txxRX9PhAzxgjj6tatm3dWKO/qq6/2qzWPPvqoL4t6HX300V5mQsFYmdhoo428M7TmmmuWDOFYWVQsNa8ShII3GN6zzz67d7xOO+00d/rpp3snDYfh3Xff9c7CQQcd5J0HjGVm9Fk5OeCAA9zaa6/tzGAtKKL01TXXXOPbkDbFccKRYAULJwvjHp2JlfX666+7ueaay6fDaGdFDFkJb0Of0AXyjtUrRc9Kgv/fmyx9LU9D2N90003XSg/L01XzvzkURf2M7wgp/Oc//+lXAXG86RdvvvmmX0GhfPjjYF9wwQWOSQDaFUcVNjpEQAREQAREQAREoC0EauJQ9OjRwxt8zBjPOOOMrnPnzt4hwFgpP7IMNAweDCHCpcJZ0nvuucfPSN94443e0MWoPPbYY1vMjmNMbr755iXjnPJwKPbcc0+38MILe6OTWfJKDjYr46Sw8oAxi0PDi1ASQkqefPJJb2Szh4E640RhdHPgMGCkkwezwsjMqsq3335bEoHVEotrTy0rJa9SAZE3GN602XPPPVda/XnttdccKwisytBu1JeVBELaMPzZQM4qAUZ8JTxhxgoIv2MvAKtGzz//fIs9Nill4Tg+8sgj3vjFmcAghim8R48e7d/H6vXiiy9G9ay8bln6Wo4XZqRjBSsrzK88fVv+x6GI9TNzKFjJYQWM9sNBDA+cB5xcnDr6KefDDjvM0f7tFbIVlq/3IiACIiACIiACzUegJg4FxncY8sQMKXHbDz74YGlm1NBlGWhs0mbGnDszhUYNxg/puSORpZkyZUrJeLc8y884FIQfYSBfe+213kAuT1P0P3IwC44BR93C1xJLLOGIO0c2HAr+D422vfbayzs9X375pWNVgzwwpMMZYEKGuOMVKx2pZaXkVVSn8DsMb0Kw2ENhB/KtscYa7vDDD3fIzoFDtdpqq/nwLn6D8R7u+7DfFp1xRljZYFZ8hhlm8DP5yyyzjGdnTlhKWaFDseqqq7rrrrvOOzrcsQrZcERj9cIxjelZ6NAiV5a+ltcXdtQl1N3yNNX+bysURf3MHAqcYGTCccCB42WysZLDe75/4403/AbtohXFauXW70VABERABERABJqfQNUOBQZxuUPBDDezo+Uz8+DMMtAIR8L4Z6bZDDqMnsmTJ3vDHgeFGVRWA3Au7HarGEUYSGxINYOJMnAoJk6c6DdmEz/O+0pi2zG0KYtwJ5PHjEbK4z1HnkNxzDHHeKOc73EoCPthNp3f4YhgmDOLjHFeSVmxvLxQCX8wvHv16uVDy8wQZpUAox2+VmfkY5Xnkksu8eFohBuVz+DHiqMN2W9CObQTTNjXgpMRzubHykp1KIrqRfhWTM/K9SRLX8vrjCHPLXxZQUE/2uNI6WfmUNBXTEfRN0IJbQ/FiBEj3KRJk1rISf/CyQvDBtujDspTBERABERABESgOQlU5VBgxLNfYJ555vEbQDEKMWrYE4Dxyx4GDBqMSWZJP/nkE+9oMFPMBmlmwjF8eLFJmA3QbNLF8MQ4GzZsmBswYIA3hkhDGBOGz5gxY3xexOVzC9bBgweX9llguDMbbnd5YiYbo5DbamIom6EVa042e1M2oTrIyV1ycAwIr2LFgTphLOOw4BCRL3XdZZdd/Cw/9eV/9oCwj2Ps2LF+A/uJJ57oZpllFh8GxMoGv0spi/JS8orVizZjhYSN5qxSwOmuu+7y9YLTSy+91MI5Q15m9XECaN9KD3gQ4oUxj6NJG8CQ2XNbCbE888pilQOnlRA4DHZWKNivQn6sUJx66qleZ2L1gmGKnsX01eS1M6tN7KEgfKg9jPKUfoajB2NW1gjJo6/xYkWDsDu7yxP7KliRoJ3hilMHEza+t6V9jYHOIiACIiACIiACf1wCVTkUOAwYep06dSq92EPBHY8INcJg4eDuTRilYTreswpg4UI4EWy25g5PbHSefvrp/Sw+oR4YeBysTBxyyCE+nKpr167+99zlB0MK4x2DCAO/S5cuJWeG22YyK015PFyPclIOHIKRI0f6PROEbxFvzsoHRity4BAx88vnOELM8LO52dKyCoBzQ/gJqxHIiww4Pzx8jzpyq07kiZVl8qbkZWnzzmzKhccqq6zi75AEb+qAkUl7ls+w4yxhkLLpvNLVCWSgTTG02XtC23DLUnhQl3BVibR5ZeGQ0KY4Qey/4MGA6BOOHXen4j0b9jGmY/VK0bMUfQ35ciMByubZHrRlrY+UfsYqA/uQyvsY/+PcWz9jU/0CCyzg+xnOBSs/rJixAmL9rNbyKz8REAEREAEREIHmJlCVQ4EBgiFfyxdG+CuvvOINbYzbrLyZ5cYgJTwl6/tafsamaWZzcVby5Ekpj5lre+5DXvrUslLyyiuj/HPKxMjOqxvGMjPwhC2V/zblf2bAaVNeOAysSrRXWaE8sXql6FmYX+w9+eXVK/bben6Pg44esmLBXiDaJ5S73Mlr7uFPtRMBERABERABEagFgaocCm6Dyn4Bwlf0ai4G3MqVW92yssAdg4444oh2a+N6liU9LdZT9hvZymItBhjlIQIiIAIiIAIi0PwEqnIouAMQoShZYRb67D9hYGIhFh1FB9rz1rfNP5yqhiIgAiIgAiLwxyRQlUNBTD2zmXqJgXSgOXSA8CsdIiACIiACIiACIlAJgaocikoKUloREAEREAEREAEREAEREIHmIyCHovnaVDUSAREQAREQAREQAREQgboRkENRN9QqSAREQAREQAREQAREQASaj4AciuZrU9VIBERABERABERABERABOpGQA5F3VCrIBEQAREQAREQAREQARFoPgJyKJqvTVUjERABERABERABERABEagbATkUdUOtgkRABERABERABERABESg+QjIoWi+NlWNREAEREAEREAEREAERKBuBORQ1A21ChIBERABERABERABERCB5iMgh6L52lQ1EgEREAEREAEREAEREIG6EZBDUTfUKkgEREAEREAEREAEREAEmo+AHIrma1PVSAREQAREQAREQAREQATqRkAORd1QqyAREAEREAEREAEREAERaD4Cciiar01VIxEQAREQAREQAREQARGoGwE5FHVDrYJEQAREQAREQAREQAREoPkIyKFovjZVjURABERABERABERABESgbgTkUNQNtQoSAREQAREQAREQAREQgeYjIIei+dpUNRIBERABERABERABERCBuhGQQ1E31CpIBERABERABERABERABJqPgByK5mtT1UgEREAEREAEREAEREAE6kZADkXdUKcV9Ntvv6UlVCoRKCDQaHrUaPIUoNNXIiACIiACIiACFRKQQ1EhsEqSY0T99NNP/pVqUL399tvu+++/d6npK5Gno6T95ZdfPLOff/65o4jccHI2mh41mjyN0mDhGMFY8Xv2+1CW31OORmkbySEC7UGgo/azZpD79x5j20OfGilPORRtbA06148//pj7+vXXX917773ndt11V7fnnnu6zz77LFrSl19+6eaZZx53ySWXuO+++y6avlkTnHvuuW6zzTZzJ5xwgvvqq6+atZoV1wtHK8XJajQ9ajR5KgZfxQ9ibYajxRix8cYbuw033NC98MILjt+011Ekz/vvv1/ReNVeMirf/yWQdY3BIMrSD643fMdk1A8//OCvS+VjRUqaPzr7ov5RCZuifNqjnxWV18hyVyJbW9PWe4xtq5zN8Ds5FG1sxbfeessNHz7crbzyyv7Vv39/N2jQIP+e87333uu+/vprd+aZZ7rFF1/cOxexonAidtllF/fggw/6i0MsfbN+/9RTT7k99tjDbbDBBu7jjz9u1mpWXK+rr77aHX/88Q4DvehoND1qNHmK2NX6u1ibwebmm292V1xxhevZs6cfNzAM2+sokgdDtJLxqr1kVL7/S+CFF6a69ddfz/Xvv7wbNGiAGzJkFbf33ru7ceMuc59//o777TcmW752v/zyhZswYZzbZpstXM+ePVzv3r1cv37LuBNOONp99dX7yWnE3bmi/lEJn6J82qOfFZXXyHJXIltb09Z7jG2rnM3wOzkUbWzFhx9+2C2zzDLummuu8QbBbLPN5s466yw3ceJEt8oqq7iLL77Yffvtt+7RRx91ffv2dTgg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jJBBHiyJPtKfcNDZDG0Ofq3ajDGCGyfAFp1FLyg3vBkDuk8/7dKli5cB45oZe+REl9gUn6LXqX0oZUxLGUNi+aTKYzrCTSvoS7A3/bPvYmWRrpKxgZtDMB7zPBLy1iECIiACItCcBGriUBgawgaYyQ+Nafsu9czyO8vkXNirySe1vGrSMaOJs0C9CSEoX8Eoz7sWfNjPwYPCYEN5rORgGJUfyMWFn42WlTotYV4YwRgC9WiLWskcyp/3PlZWKue8/NvyOYx50Z44rzgY4UpXJXnWQtdq2RfJq1pdjLUZfKg3G+uz+kQl/GqZtohjJWNIUT6VyMvEAhMM8Mw7UspKHRsop5oxKE9GfS4CIiACItA4BGrqUDROtSRJIxDAcMGY0CvOACeR0DXCBQmHIryMsDVm3uvhzDWCvkgGERABERABERCBjklADkXHbLcOITV7U9Zee20f9kLoi175DLjz0owzzujDgnAm2EfBpnuYsfegaDa5QyiDhBQBERABERABEWhaAnIomrZpf/+K8VA9bkvJxnW92s6Au/fIofj99VkSiIAIiIAIiIAIZBOQQ5HNRZ+KgAiIgAiIgAiIgAiIgAgkEJBDkQBJSURABERABERABERABERABLIJyKHI5qJPRUAEREAEREAEREAEREAEEgjIoUiApCQiIAIiIAIiIAIiIAIiIALZBORQZHPRpyIgAiIgAiIgAiIgAiIgAgkE5FAkQFISERABERABERABERABERCBbAJyKLK56FMREAEREAEREAEREAEREIEEAnIoEiApiQiIgAiIgAiIgAiIgAiIQDYBORTZXPSpCIiACIiACIiACIiACIhAAgE5FAmQlEQEREAEREAEREAEREAERCCbgByKbC76VAREQAREQAREQAREQAREIIGAHIoESEoiAiIgAiIgAiIgAiIgAiKQTUAORTYXfSoCIiACIiACIiACIiACIpBAQA5FAiQlEQEREAEREAEREAEREAERyCYghyKbiz4VAREQAREQAREQAREQARFIICCHIgGSkoiACIiACIiACIiACIiACGQTkEORzUWfioAIiIAIiIAIiIAIiIAIJBCQQ5EASUlEQAREQAREQAREQAREQASyCcihyOaiT0VABERABERABERABERABBII/H/xbc6FOOSRywAAAABJRU5ErkJggg==" width="630" /></div><div>showing the original source...</div><div><br /></div><div>[[ This blog edited to include snapshot of the BSS manual entry ]]</div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com0tag:blogger.com,1999:blog-32797070.post-52114792456143278512020-07-14T16:40:00.002-06:002020-07-14T16:41:25.791-06:002.11BSD Original Tapes Recreation<h1 style="text-align: left;">In Search of 2.11BSD, as released</h1><div>Almost all of the BSD releases have been well preserved. If you want to find 1BSD, or 2BSD or 4.3-TAHOE BSD you can find them online with little fuss. However, if you search for 2.11BSD, you'll find it easily enough, but it won't be the original. You'll find either the latest patched version (2.11BSD pl 469), or one of the earlier popular version (pl 430 is popular). You can even find the RetroBSD project which used 2.11BSD as a starting point to create systems for tiny mips-based PIC controllers. You'll find every single patch that's been issued for the system.</div><div><img alt="Great promotional image of a PDP-11. Looks like an LA30 DecWriter ..." height="350" src="https://i.pinimg.com/originals/c6/92/c3/c692c3ecc61a6f6f63d841dd419d58c1.jpg" width="256" /></div><div><br /></div><div>What you will not find, however, is the original 2.11BSD release tapes. You won't find the original sources. With some digging, you can find is 2.11BSD pl 195. This was released about 30 months after the original was released, and is the oldest one that's known to exist. The reason is that the original 2.11BSD tapes were distributed by USENIX. They charged a large fee for the tapes, and so not too many people bought them. And this was before Caldera released the ancient Unixes under a permissive license, so the bulk of the feed went to AT&T. It's cost made it a low volume item. Plus, there were patches all the time, so the master tapes were respun from time to time. The originals weren't preserved, alas, because storage was expensive and by the early 1990s the PDP-11s were a bit of a fringe machine, except in certain niches with long procurement times...</div><div><br /></div><div>But wait, you said we have all the patches, patch -R is super easy to use. Just use that to go backwards, right?</div><div><br /></div><div>Well, no. The patches aren't all context diffs. Instead they include instructions like "remove these files, then extract this uuencoded compress tarball" or other information destroying instructions. So, the information is lost, maybe for good. We can't get there.</div><div><br /></div><div>Or can we. If we look at it in a vacuum, it sure sounds hopeless. Information destroyed, you said. However, while it's true information is destroyed in many of the patches, it's only one copy that's destroyed. We have other sources of information. The 2.11BSD release is part of a series of releases in the 2BSD family, so we have 2.10.1BSD, the prior release. That's been preserved. We know from the release notes that significant influxes of code came from 4.3BSD. There's also a usenet news group called comp.bugs.2bsd that posted patches. It's known that these patches wound up in 2.11BSD (also all the patches to 2.11BSD were posted there by the original authors until usenet went away).</div><div><br /></div><h2 style="text-align: left;">The Project</h2><div>So, that brings us to my 2.11BSD pl 0 restoration project. The goal of the project is to create two main artifacts. First, it would be cool to have a git repo that has all the 2.11BSD patch points in it. Second, it would be really cool to have a near copy of the 2.11BSD release tapes. This project aims to create these artifacts in a reproducible way. When completed, anybody can take the existing artifacts we have, the scripts from the project (including all the hints needed to get the data from other projects, as well as a few hand-crafted patches which produce results consistent with all know info about these files).</div><h3 style="text-align: left;">Status</h3><div>I've worked my way through the 195 patches undoing them. Many of them are simple patches, packed in an annoying eclectic number of different ways. Some, however, destroy information and require research to untangle. I've done the best I can and have made it back to patch level 0 sources (almost, there's one or two lingering issues that need to be tracked down on relatively unimportant files). I've created a script to create a tape to load into my 2.11BSD pl 195 to build, in a chroot, a 2.11BSD pl 0 system.</div><div><br /></div><div>There's a script that I've build that builds everything at the pl0 level (twice). There's noise in the release notes of at least some of these releases that there reproducibility issues. It's currently past the initial bootstrap phase. I can build all the libraries, but automation is needed.</div><h3 style="text-align: left;">Following Along</h3><div>There's two ways to follow along. One is to follow me on Twitter. My handle is <a href="https://twitter.com/bsdimp">@bsdimp</a>. Or you can look at my <a href="https://github.com/bsdimp/mk211bsd">github project</a>. I've written up the status there (though it's a couple of weeks out of date) and you can find the start of a paper (though it's even more out of date, but has more background). I update at least once a week, but sometimes more as I have time.</div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com0tag:blogger.com,1999:blog-32797070.post-39902070573021151582020-07-12T17:42:00.005-06:002020-07-13T11:53:03.078-06:00Old-school Disk Partitioning<h1 style="text-align: left;">Old-School Disk Partitions</h1><div>Unix started out life in 1970. Many of the things it did, it had to invent on the fly. Disk handling was one of those items. Something we take utterly for granted today was, once upon a time, an area of active innovation. This blog will explore the early days of Unix: when we had static partitioning compiled into the driver.</div><div><br /></div><div><img height="208" src="http://www.computer-history.info/Page4.dir/pages/PDP.11.dir/images/WinchesterDiskPack.big.jpg" width="314" /></div><div><br /></div><div>Typical <a href="http://www.computer-history.info/Page4.dir/pages/PDP.11.dir/images/WinchesterDiskPack.big.jpg">drive</a> of the era: large, and difficult to manage (an <a href="http://www.pdp-11.nl/peripherals/disk/rl-info.html">RL01 or RL02 </a>by the looks of it good for maybe 5MB or 10MB of storage).</div><h2 style="text-align: left;">Evolution of Partitions</h2><div>Unix from the earliest days had at least two types of data that was stored on disks. The first type was a file system, which offered a hierarchical name space. The second type was swap. Unix was a swapping system from the earliest days, and to multiplex jobs into and out of memory. The kernel would keep track of what blocks were assigned to which process.</div><div><br /></div><div>Since the disk played two different roles, with different allocation policies and persistent storage. To keep things simple, in the first edition, the disk was partitioned in a static way. The file system used its part of the disk, and swap used the rest.</div><div><br /></div><div>DEC never did produce a partitioning standard (though later it used Unix's on its Unix-related products). This mean that the Unix guys had nothing to draw from, and so failed to produce a standard before Unix left the research group.</div><h3 style="text-align: left;">1st through 3rd Edition</h3><div>There was almost nothing resembling partitioning in the 1st-3rd edition kernels. Unix booted off the 'drum' device using the top 64 blocks to store itself. The rest of that disk was reserved for swapping processes into/out of core memory. The sources refer to this as 'the drum' and there were 1024 256-byte blocks in the drum.</div><div><br /></div><div>The disks were presented as a device node, which was the entire disk. This is from the 3rd edition manual page:</div><blockquote><div>rk? refers to an entire RK03 disk as a single sequentially-addressed file. Its 256-word blocks are numbered 0 to 4871. Like the RF disk and the tape files, its addressing is block-oriented.</div></blockquote><div>which describes a single file that has its entire block store available. The 3rd edition has the enigmatic /crp filesystem documented for one of the drives (<a href="https://inbox.vuxu.org/tuhs/9b7eca07-8233-07c8-3ff7-297aa43759b1@mhorton.net/">I wonder what it's an abbreviation for</a>):</div><div><table border="1" bordercolor="#888" cellspacing="0" style="border-collapse: collapse; border-color: rgb(136, 136, 136); border-width: 1px;"><tbody><tr><td style="min-width: 60px;"> /dev/rk0</td><td style="min-width: 60px;">/ filesystem </td></tr><tr><td style="min-width: 60px;"> /dev/rk1<span> <span> </span></span></td><td style="min-width: 60px;">/usr </td></tr><tr><td> /dev/rk2</td><td>/sys </td></tr><tr><td> /dev/rk3</td><td>/crp </td></tr></tbody></table></div><div>which also shows that you had one filesystem per disk. At 1.2MB, these drives are little bigger than a floppy disk, so having just one filesystem per drive was not much of a limitation. Also note that the sector size was 256 words, or 512 bytes.</div><div><br /></div><div>Since we have limited sources for this time period, it's hard to say for sure. The bulk of the surviving data, though, says at most the last 64 blocks are reserved for Unix...</div><h3 style="text-align: left;">4th Edition</h3><div>With the 4th Edition, we start to see multiple files that refer to different sections of the disk. This was done because the new rp03 drives supported 81200 blocks, which exceeded the limits of the time of 65536 blocks per device. It also allows the drive to be broken up into more manageable chunks. In this release, there were 8 different files in the /dev directory named rp0 to rp7. For a second drive connected, rp8..rp15 would reference that drive. The manual has this table in it, which mirrors the surviving code:</div><div><table border="1" bordercolor="#888" cellspacing="0" style="border-collapse: collapse; border-color: rgb(136, 136, 136); border-width: 1px;"><tbody><tr><td style="min-width: 60px;"> disk</td><td style="min-width: 60px;"> start</td><td style="min-width: 60px;">length </td></tr><tr><td> 0</td><td> 0</td><td>40600 </td></tr><tr><td> 1</td><td> 40600</td><td>40600 </td></tr><tr><td> 2</td><td> 0</td><td>3200 </td></tr><tr><td> 3</td><td> 3200</td><td>39000 </td></tr><tr><td> 4</td><td> 42200</td><td>39000 </td></tr><tr><td style="min-width: 60px;"> 5-7</td><td style="min-width: 60px;">Unassigned </td><td style="min-width: 60px;"> </td></tr></tbody></table>which allows basically two configurations for the drive: split in half, or split into a small root partition and two others. But where's the partition for swap?</div><div><br /></div><div>There isn't one... Swap space in the 4th Edition was configured in param.h #defines. You defined the device, start and length on that device to use. The system would then configure that during early boot. The down side, though, of #defines was one couldn't easily do a binary patch. Swap was put in between the used parts of other of the disk. This was tricky to get right, since you had to map out the system.</div><div><br /></div><div>You'd think that all the drives were like this, but that's not the case. The rf(4) driver specified the size of the drive itself with different minors. The rk(4) driver allowed one to experiment with different interleaf factors with different minor numbers. It really was up to the drive itself to decide how to interpret the minor number. This isn't unusual.... the various magtape drivers used minor numbers to specify density and whether or not to rewind on close.</div><h3 style="text-align: left;">5th and 6th Editions</h3><div>The 5th edition continued the evolution. It changed the table above and there's a number of overlapping regions that need special care to be used. This also meant that you'd have to re-install the system, or hack the tables in the driver when you upgraded, if you used xp3 or xp4. There was only about 7 months between the 4th and 5th editions, so I suspect this problem wasn't too common. When 4th edition came out, there were 20 sites running it, by the 5th edition it was up to 50, so the numbers weren't huge. Since the kernel was patchable with adb or front panel switches, this issue likely could be mitigated enough to rebuild. Folks running 4th edition were trailblazers, by definition, so could be expected to cope with any upgrades they were doing to the 5th edition. By the time the 6th edition came out, it was in the hundreds or thousands, which may explain why it remained constant between 5th and 6th edition releases. The rp(4)'s predefined table became this:</div><div><table border="1" bordercolor="#888" cellspacing="0" style="border-collapse: collapse; border-color: rgb(136, 136, 136); border-width: 1px;"><tbody><tr><td style="min-width: 60px;"> disk</td><td style="min-width: 60px;">start</td><td style="min-width: 60px;">length </td></tr><tr><td> 0</td><td> 0</td><td>40600 </td></tr><tr><td>1 </td><td>40600 </td><td>40600 </td></tr><tr><td> 2</td><td>0 </td><td>9200 </td></tr><tr><td> 3</td><td>72000 </td><td>9200 </td></tr><tr><td> 4</td><td> 0</td><td>65535 </td></tr><tr><td> 5</td><td> 15600</td><td>65535 </td></tr><tr><td style="min-width: 60px;"> 6-7</td><td style="min-width: 60px;">Unassigned </td><td style="min-width: 60px;"> </td></tr></tbody></table><br /></div><div>Swapping was still handled by using the space between the partitions or after the end of the filesystem. The 4th edition way of configuring swap was improved by moving the defines to variables that can be more easily patched with adb(1). So through the 6th edition, swap still didn't need its own partition.</div><div><br /></div><div>What is interesting is that 5th edition introduced raw character devices as well as block devices used for filesystem.</div><div><br /></div><div>The 6th edition uses the same tables as 5th edition. It also introduces other disk interfaces with similar hard-coded partitions using a similar scheme.</div><h3 style="text-align: left;">7th Edition</h3><div>The 7th Edition changes the layout again. It wasn't to be mean, but was because DEC introduced newer, larger drives. 7th Edition also allows larger partitions, as disk addresses are now 3 bytes instead of two. Some drivers now support multiple drives, so the partitions are fixed, but setup so that different layouts of the devices are supported, as well as different models. For example, the hp(4) driver supports both the rp04/rp05 and the rp06 drives (which are twice as large as the rp04/rp05 drives) so has a number of different layouts that align to this size difference so they can be used on as many different drives as possible. The hs(4) driver was also added as well, but it was more of a swap / drum device.</div><div><br /></div><div>The problem in the PDP-11 world is that new controllers have been appearing, some from third parties, and the number of disks you can connect to the PDP-11 has started to proliferate. This problem was only going to get worse.</div><div><h3>2BSD through 2.11BSD</h3><div>Skipping ahead a bit, the 7th Edition begat 2BSD which begat a series of releases for the PDP-11 (starting amusingly enough with the 'last' PDP-11 release: 2.8BSD!). By the time we get to 2.11BSD, we have a system that has about 50 different types of disks and partitioning schemes that are increasingly difficult to manage. Each one is a special little snowflake depending on what kind of drive is attached. The table in xp the driver runs 75 lines, which the authors know is bad because they prefix this table with:</div><blockquote><pre>/* THIS SHOULD BE READ OFF THE PACK, PER DRIVE */</pre></blockquote><div> We'll return to 2.11BSD in a part 2.</div><h3>4BSD</h3><div>4BSD had a similar problem. They made it more palatable by creating a program, diskpart, which displayed the default disk partitions for a specific drive type, or allowed one to create partitions tables to cut and paste into a driver and/or config files. This helped, but was still compiled into the kernel rather than on the disk pack. 4.1BSD introduced, in 1981, a new wrinkle:</div><blockquote><pre> * The bad sector information and replacement sectors
* are conventionally only accessible through the
* 'h' file system partition of the disk. If that
* partition is used for a file system, the user is
* responsible for making sure that it does not overlap
* the bad sector information or any replacement sectors.</pre></blockquote><div>Progress, but it was slow. Through at least 4.3BSD this was the case: every driver had their own table that was hand-tweaked for the drives that driver supported. This was OK, as far as it went, but as the industry shifted away from controller + disk combos where there were only a few choices to standard interfaces between the drive and host and most of the functionality in the drive, this became an untenable situation.</div></div><div><br /></div><div>We'll explore how it got worse, before it got better in my second part. We'll see how different vendors innovated in this area ahead of a solution that appeared in 4.3BSD Tahoe and in AT&T System Vr3.0 around the same time.</div><div><br /></div><div>[[ edited to correct typos ]]</div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com2tag:blogger.com,1999:blog-32797070.post-27060498341357834712020-06-27T17:58:00.011-06:002020-06-29T16:39:44.438-06:00Whither chroot?<h1 style="text-align: left;">Chroot Origins</h1><div>This blog post will examine original artifacts to clear up some confusion about where chroot(2) and chroot(8) came from. The answer turns out to be simple, and the confusion was understandable. This shows the benefits of groups like <a href="https://www.tuhs.org/">TUHS</a> in preserving Unix history, and how the kindness of <a href="https://github.com/dspinellis/unix-history-repo/blob/Research-PDP7-Snapshot-Development/Caldera-license.pdf">Caldera</a> and <a href="https://github.com/dspinellis/unix-history-repo/blob/Research-PDP7-Snapshot-Development/ALU-USA-statement.pdf">Lucent</a> in releasing the historic Unix systems has helped in our understanding of the evolution of Unix. </div><div><br /></div><div>EDIT: After initially published, this was revised with more links to historic artifacts (inline and in the Appendix) and a screen shot of wikipedia. The Wikipedia chroot entry has since been updated.</div><h2 style="text-align: left;">tl;dr: chroot(2) came from 7th Edition Unix</h2><div>chroot is system call 61 in 7th Edition Unix from Bell Labs. There is no chroot system call in 6th Edition or earlier. All derivatives of 7th edition have chroot(2) for at least 2 decades after the 7th Edition release in 1979.</div><div><br /></div><h2 style="text-align: left;">What confusion?</h2><div>Wikipedia has this in their entry for <a href="https://en.wikipedia.org/wiki/Chroot">chroot</a>:<div class="separator" style="clear: both; text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd9olZYBS_1faaxzdidPHCJjX8X-DLLYXGiJpVBp4xxI00T573nDQyr4EPsXdIxHQdOD2rcBYEhOG3mWUgNjEFOxiltu0eTWaVKTQeLZh2TbP26S7epalufIuLzevvxPF76x20/s780/wiki-chroot.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="111" data-original-width="780" height="91" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd9olZYBS_1faaxzdidPHCJjX8X-DLLYXGiJpVBp4xxI00T573nDQyr4EPsXdIxHQdOD2rcBYEhOG3mWUgNjEFOxiltu0eTWaVKTQeLZh2TbP26S7epalufIuLzevvxPF76x20/w625-h91/wiki-chroot.png" width="625" /></a></div></div><div class="separator" style="clear: both; text-align: left;">which suggests that Bill Joy had something to do with its creation in the BSD world. Turns out it's confused because earlier literature on the topic is also confused.</div><h2 style="text-align: left;">What Sparked the Confusion?</h2><div>Poul-Henning Kamp created the jail system for FreeBSD. This system takes a chroot environment to the next level in terms of security. As a security device, chroot was terrible because it's fairly easy to jailbreak out of a chroot if you are root. The short version is to open '/' to get a reference to it. Then chroot to some directory further down the tree. Then fchdir to the fd you saved from '/'. Now chdir(".."); a bunch of times. This will walk you back to the real root. Now chroot(".") and you are out. There's lots of variations on this theme, and dozens of papers in the literature and an almost infinite number of ways to leak references to FDs outside the jail...</div><div><br /></div><div>One of the wonderful thing he did was to create an extensive set of docs and write a paper about the jail(2) facilities. In this <a href="https://docs.freebsd.org/44doc/papers/jail/jail-9.html">paper</a> Mr Kamp wrote:</div><blockquote><div><dt>[CHROOT]</dt><dd>Dr. Marshall Kirk Mckusick, private communication: ``According to the SCCS logs, the chroot call was added by Bill Joy on March 18, 1982 approximately 1.5 years before 4.2BSD was released.<tt> </tt>That was well before we had ftp servers of any sort (ftp did not show up in the source tree until January 1983). My best guess as to its purpose was to allow Bill to chroot into the /4.2BSD build directory and build a system using only the files, include files, etc contained in that tree. That was the only use of chroot that I remember from the early days.''</dd></div></blockquote><div>This paper was presented at the 2nd International System Administration and Networking Conference "SANE 2000" May 22-25, 2000 in Maastricht, The Netherlands and is published in the proceedings.</div><div><br /></div><div>In 2000, the BSD SCCS tree was not publicly available. Dr McKusick had access to it as his role with the Computer Science Research Group (CSRG) that produce the 4BSD releases. This predated various litigation that suggested 32V had no copyright, and the Ancient Unix License that SCO granted for 32V, so it was necessarily private per agreements between AT&T and The University of California at Berkeley.</div><h2 style="text-align: left;">What Actually Happened in 1982?</h2><div>What happened was a shuffling of the deck chairs. <a href="https://github.com/csrg/csrg/blob/e0bc74c24f128306f5f82601b4145954251196f4/sys/kern/vfs_syscalls.c#L28">the commit log</a>, made as root, from March 18, 1992 says:</div><blockquote><div><p class="commit-title" style="box-sizing: border-box; color: #05264c; font-size: 18px; font-weight: 600; margin: 0px 0px 8px;">rearrange for kirk</p><div class="commit-desc" style="box-sizing: border-box; color: #24292e; font-size: 14px; margin: -5px 0px 10px;"><pre style="box-sizing: border-box; color: #444d56; font-size: 13px; line-height: 1.45; margin-bottom: 0px; margin-top: 10px; max-width: 100%; overflow-wrap: break-word; overflow: visible; white-space: pre-wrap;">SCCS-vsn: 4.21</pre></div></div></blockquote><div>and <a href="https://github.com/csrg/csrg/commit/e0bc74c24f128306f5f82601b4145954251196f4#diff-b7848ad35461d6b58c997a2d65de118dR28">introduces chroot to ufs_syscalls.c</a>. If you read the diffs, it also introduced '<a href="https://github.com/csrg/csrg/commit/e0bc74c24f128306f5f82601b4145954251196f4#diff-b7848ad35461d6b58c997a2d65de118dR67">open</a>', '<a href="https://github.com/csrg/csrg/commit/e0bc74c24f128306f5f82601b4145954251196f4#diff-b7848ad35461d6b58c997a2d65de118dR85">creat</a>' and several others to this file. These system calls are known to be in the PDP-7 Unix implementation, so it's unlikely that they were really introduced in this commit. One problem that makes this harder to track is that SCCS didn't track renames, and ufs_syscalls.c was renamed to vfs_syscalls.c in 4.4BSD. It's quite clearly in ufs_syscalls.c in 4.1cBSD:</div><blockquote><pre style="text-align: left;">/*
* Change notion of root (``/'') directory.
*/
chroot()
{
if (suser())
chdirec(&u.u_rdir);
}</pre></blockquote><div>which is the identical code that was added by Bill Joy to ufs_syscalls.c. This was moved between 4.1BSD and 4.1c from sys4.c as part of the UFS work, and is different only by the BSD-stylistic change to add a blank line before the rest of the code if there's no local variables:</div><blockquote><pre style="text-align: left;">chroot()
{
if (suser())
chdirec(&u.u_rdir);
}</pre></blockquote><div>which, apart from the comment, is identical. Without beating a dead horse (too late?), this code is the same all the way back to 4BSD, 3BSD, 32V, 2.8BSD and finally to V7:</div><blockquote><pre style="text-align: left;">chroot()
{
if (suser())
chdirec(&u.u_rdir);
}</pre></blockquote><div>Since the code is identical from V7 all the way through 4.2BSD when it was, according to this footnote in the jail appeared, added. This is direct evidence that the footnote was in error.</div><div><br /></div><div>So what was the rearrangement for Kirk? It was to move things around in the kernel to make the system calls more generic. It was code motion, nothing more, that Dr. McKusick was reporting in the private email to Mr Kamp. Now that the SCCS tree is public, via a translation to svn by John Baldwin, we can see the above.</div><div><br /></div><h2 style="text-align: left;">chroot(2) Conclusions</h2><div>Given that the code was moved around alot, it's an understandable mistake that Dr. McKusick made, which explains how the error could have happened. Given that the code is identical to v7 code, and it was somewhere in all the extant versions between the two (2BSD, 32V, 3BSD, 4.0BSD, 4.1BSD, 4.1cBSD and 4.2BSD), modulo a trivial whitespace change, we can conclude that Bill Joy did not introduce chroot into 4.2BSD, but instead it was moved around a lot from the original V7 code.</div><div><br /></div><div>The FreeBSD chroot(2) manual has been updated to correct this mistake.</div><div><br /></div><h2 style="text-align: left;">But what about chroot(8)?</h2><div>But what about chroot(8)? There's some confusion about this as well. Until recently, chroot(8) said in FreeBSD:</div><blockquote><div><div><b>HISTORY</b></div><div> The <b>chroot</b> utility first appeared in 4.4BSD.</div></div></blockquote><div>However, that too is in error (or was at least not precise enough). The error comes from the 4.4BSD release itself, which has identical text. In a sense this is not wrong. 4.4BSD was the first full release that chroot(8) appeared in in the Berkeley world. It's first appearance, though, in any BSD tape was in the interim 4.3BSD-Reno release.</div><div><br /></div><div>But what about the AT&T world? There, more system calls are wrapped in programs to make it easier to use in shell scripts. It turns out that System III had a usr/src/cmd/chroot.c, which I won't quote here, that's a different chroot than appeared in BSD (the code looks completely different, apart from the elements that have to be the same...). So, the history has been corrected to read:</div><blockquote><div><div><b>HISTORY</b></div><div> The <b>chroot</b> utility first appeared in AT&T System III UNIX and</div><div> 4.3BSD-Reno.</div></div></blockquote><div>to represent the first time in each of the two branches of Unix after the 7th Edition that it appeared.</div><div><br /></div><div>And that concludes today's software archeology deep dive on chroot...</div><h2 style="text-align: left;">Appendix</h2><div>Here's the evolution of the chroot(2) implementation, as see from TUHS. You'll need to search for 'chroot()' in each of these source files since the current TUHS web site doesn't allow line number links.</div><div>AT&T Unix: <a href="https://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/sys/sys/sys4.c">V7</a>, <a href="https://minnie.tuhs.org/cgi-bin/utree.pl?file=32V/usr/src/sys/sys/sys4.c">32V</a>, <a href="https://minnie.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/uts/pdp11/os/sys4.c">System III</a>, <a href="https://minnie.tuhs.org/cgi-bin/utree.pl?file=pdp11v/usr/src/uts/pdp11/os/sys4.c">System V</a></div><div>BSD: <a href="https://minnie.tuhs.org/cgi-bin/utree.pl?file=2.9BSD/usr/src/sys/sys/sys4.c">2.9BSD</a>, <a href="https://minnie.tuhs.org/cgi-bin/utree.pl?file=3BSD/usr/src/sys/sys/sys4.c">3BSD</a>, <a href="https://minnie.tuhs.org/cgi-bin/utree.pl?file=4BSD/usr/src/sys/sys/sys4.c">4.0BSD</a>, <a href="https://minnie.tuhs.org/cgi-bin/utree.pl?file=BBN-Vax-TCP/sys/sys4.c">4.1BSD</a>, <a href="https://minnie.tuhs.org/cgi-bin/utree.pl?file=4.1cBSD/a/sys/sys/ufs_syscalls.c">4.1cBSD</a>, <a href="https://minnie.tuhs.org/cgi-bin/utree.pl?file=4.2BSD/usr/src/sys/sys/ufs_syscalls.c">4.2BSD</a>, <a href="https://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD/usr/src/sys/sys/ufs_syscalls.c">4.3BSD</a>, <a href="https://minnie.tuhs.org/cgi-bin/utree.pl?file=4.4BSD/usr/src/sys/kern/vfs_syscalls.c">4.4BSD</a>.</div><div><br /></div><div>I'd also like to plug the <a href="https://github.com/dspinellis/unix-history-repo">Historic Unix Repo</a>, which also helps navigate and allows line numbers. Here's a link to the<a href="https://github.com/dspinellis/unix-history-repo/blob/BSD-4_1c_2-Snapshot-Development/a/sys/sys/ufs_syscalls.c#L33"> 4.1c</a> version, for example. I recalled this after I'd found all the TUHS references, or I'd done all of them like that.</div>Warner Loshhttp://www.blogger.com/profile/11922167595789336900noreply@blogger.com1