Automating Baremetal Node Creation for Ironic

Sometime your shell scripts get out of control. Sometimes you are proud of them. Sometimes….both.

I need to be able to re-add a bunch of nodes to an OpenStack cluster on a regular basis. Yes, I could do this with Ansible, but, well, Ansible is great for doing something via SSH, and this just needs to be done here and now. So shell is fine.

This started as a one liner, and got a bit bigger.

Continue reading

Changing the Output in (ARM64) Assembly

When ever I write new console based code from scratch, I start with “Hello World.” Then I make one small change at a time, test it, and commit. Then I move on. While this slow process might seem tedious, it is based on years of wasting time debugging my own poorly written code in interim changes.

Once I had “Hello, World!” working in assembly, I want to make a single character change to message and see it in the console. Here’s my steps.

Continue reading

Simplest (ARM64) Assembly Program that Runs without an error

In order for a program to run successfully, it needs two things: an entry symbol, and a return code that represents that success. The following program provides those two things.

.global _start
 
_start:     
            MOV     X0, #0
            MOV     X8, #93
            SVC     0

Compile it using the simple Makefile from the previous article.

The symbol _start is a special symbol expected by the linker. If you try to rename like this…….

.global _ADAM
 
_ADAM:     
            MOV     X0, #0
            MOV     X8, #93
            SVC     0

…you get the following error:

$ make other
as -o other.o other.s
ld -o other other.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000000400078

Which will still compile and run.

If you leave off the three assembly instructions at the end, you do not return 0 indicating the program success.

.global _start
 
_start:

That gives you this error:

]$ ./bad_return -bash: ./bad_return: cannot execute binary file: Exec format error

To be honest, there are no instruction in the code, and I think that is a different problem. If we skip executing the function to send the return code:

.global _start
 
_start:     
            MOV     X0, #0
            MOV     X8, #93

That gives this error when run:

$ ./bad_return 
Illegal instruction (core dumped)

Simple Makefile for assembly executables

I want to automatically build assembly files into executable binaries. The following Makefile seems to be sufficient. I am sure I will add to it over time.

All I have to modify is the SRC_FILES line to add a new target

Note that html does not honor the tab characters.

EDIT: I swapped the SRC_ and B_ files so that the top list is the end result. This allows you to just run make and build all of your executables. It would also let you mix and match between assembly and other languages. But (most importantly) I like it better.

B_FILES=simple printer
SRC_FILES = $(B_FILES:%=%.s)
O_FILES = $(SRC_FILES:%.s=%.o)
 
all: $(B_FILES) 
 
%: %.s 
	as -o $@.o $<
	ld -o $@ $@.o
 
clean:
	rm -f $(O_FILES) $(B_FILES)


JNLP Access to BMC On Fedora

Ampere has two models of Servers out: Falcon and Mt. Jades. The Falcons are the older one, and make up many of our utility servers.

I recently had to get in to a serial console on the machine. The IPMI address hosts a web console. From that you can get a serial console on the server, but you need JNLP, which stands for Java Net Launch Protocol. It is implemented by IcedTea in OpenJDK: icedtea-web is the name of the RPM on Fedora 34.

Building the Linux Kernel in a GitLab Runner

Git Lab provides a mechanism to run workloads triggered by a git commit. We try to let the automation do as much work as possible before interrupting a human code reviewer. We want to know if the code is right in as objective a manner as possible before we take the expensive context switch to perform a code review.

Continue reading