website: extend info on m5ops and tips for disk

On the m5ops page, this commit added a section about the "_addr" version
of m5ops and some examples of using m5ops.

On the disks page, this commit added a tips under the qemu method.

Change-Id: Ifb090a493fc5feee6edb0edc24a4b2a70015501e
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5-website/+/62371
Reviewed-by: Bobby Bruce <bbruce@ucdavis.edu>
Maintainer: Bobby Bruce <bbruce@ucdavis.edu>
Tested-by: Bobby Bruce <bbruce@ucdavis.edu>
diff --git a/_pages/documentation/general_docs/fullsystem/disks.md b/_pages/documentation/general_docs/fullsystem/disks.md
index 253ad0f..49572c7 100644
--- a/_pages/documentation/general_docs/fullsystem/disks.md
+++ b/_pages/documentation/general_docs/fullsystem/disks.md
@@ -483,7 +483,8 @@
 WantedBy=default.target
 ```
 
-Enable the gem5 service and disable the ttyS0 service.
+Enable the gem5 service and **disable the ttyS0 service**.
+If your disk boots up to a login prompt, it might be caused by not disabling the ttyS0 service.
 
 ```
 systemctl enable gem5.service
diff --git a/_pages/documentation/general_docs/m5ops.md b/_pages/documentation/general_docs/m5ops.md
index 985a2ec..6aac998 100644
--- a/_pages/documentation/general_docs/m5ops.md
+++ b/_pages/documentation/general_docs/m5ops.md
@@ -9,6 +9,7 @@
 # M5ops
 
 This page explains the special opcodes that can be used in M5 to do checkpoints etc. The m5 utility program (on our disk image and in util/m5/*) provides some of this functionality on the command line. In many cases it is best to insert the operation directly in the source code of your application of interest. You should be able to link with the appropriate libm5.a file and the m5ops.h header file has prototypes for all the functions.
+A tutorial on using the M5ops was given as a part of the gem5 2022 Bootcamp. A recording of this event can be found [here](https://youtu.be/TeHKMVOWUAY).
 
 ## Building M5 and libm5
 
@@ -111,3 +112,71 @@
 CFLAGS += -I$(GEM5_PATH)/include
 LDFLAGS += -L$(GEM5_PATH)/util/m5/build/$(TARGET_ISA)/out -lm5
 ```
+
+Here is a simple Makefile example:
+
+```make
+TARGET_ISA=x86
+
+GEM5_HOME=$(realpath ./)
+$(info   GEM5_HOME is $(GEM5_HOME))
+
+CXX=g++
+
+CFLAGS=-I$(GEM5_HOME)/include
+
+LDFLAGS=-L$(GEM5_HOME)/util/m5/build/$(TARGET_ISA)/out -lm5
+
+OBJECTS= hello_world
+
+all: hello_world
+
+hello_world:
+	$(CXX) -o $(OBJECTS) hello_world.cpp $(CFLAGS) $(LDFLAGS)
+
+clean:
+	rm -f $(OBJECTS)
+```
+
+
+## Using the "_addr" version of M5ops
+
+The "_addr" version of m5ops triggers the same simulation specific functionality as the default m5ops, but they use different trigger mechanisms. Below is a quote from the m5 utility README.md explaining the trigger mechanisms.
+
+```markdown
+The bare function name as defined in the header file will use the magic instruction based trigger mechanism, what would have historically been the default.
+
+Some macros at the end of the header file will set up other declarations which mirror all of the other definitions, but with an “_addr” and “_semi” suffix. These other versions will trigger the same gem5 operations, but using the “magic” address or semihosting trigger mechanisms. While those functions will be unconditionally declared in the header file, a definition will exist in the library only if that trigger mechanism is supported for that ABI.
+```
+
+In order to use the "_addr" version of m5ops, you need to include th m5_mmap.h header file, pass the "magic" address (ex. "0xFFFF0000" for x86) to m5op_addr, then call the map_m5_mem() to open /dev/mem. You can insert m5ops by adding "_addr" at the end of the original m5ops functions.
+
+Here is a simple example using the "_addr" version of the m5ops:
+
+```c
+#include <gem5/m5ops.h>
+#include <m5_mmap.h>
+#include <stdio.h>
+
+#define GEM5
+
+int main(void) {
+#ifdef GEM5
+    m5op_addr = 0xFFFF0000;
+    map_m5_mem();
+    m5_work_begin_addr(0,0);
+#endif
+
+    print("hello world!");
+
+#ifdef GEM5
+    m5_work_end_addr(0,0);
+#endif
+}
+```
+
+When you run the applications with m5ops inserted in FS mode with a KVM CPU, this error might appear.
+
+    ```illegal instruction (core dumped)```
+
+This is because m5ops instructions are not valid instructions to the host. Using the "_addr" version of the m5ops can fix this issue, so it might be necessary to use the "_addr" version if you want to integrate m5ops into your applications or use the m5 binary utility when running with KVM CPUs.