Skip to content

Commit

Permalink
mambo/mambo_utils.tcl: Inject an MCE at a specified address
Browse files Browse the repository at this point in the history
Currently we don't support injecting an MCE on a specific address.
This is useful for testing functionality like memcpy_mcsafe()
(see https://patchwork.ozlabs.org/cover/893339/)

The core of the functionality is a routine called
inject_mce_ue_on_addr, which takes an addr argument and injects
an MCE (load/store with UE) when the specified address is accessed
by code. This functionality can easily be enhanced to cover
instruction UE's as well.

A sample use case to create an MCE on stack access would be

set addr [mysim display gpr 1]
inject_mce_ue_on_addr $addr

This would cause an mce on any r1 or r1 based access

Signed-off-by: Balbir Singh <bsingharora@gmail.com>
Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
  • Loading branch information
bsingharora authored and stewartsmith committed Apr 20, 2018
1 parent 0a4d051 commit bdd925a
Showing 1 changed file with 15 additions and 1 deletion.
16 changes: 15 additions & 1 deletion external/mambo/mambo_utils.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,8 @@ proc mce_trigger { args } {
#
# Default with no arguments is a recoverable i-side TLB multi-hit
# Other options:
# d_side=1 cause=0x80 - recoverable d-side SLB multi-hit
# d_side=1 dsisr=0x80 - recoverable d-side SLB multi-hit
# d_side=1 dsisr=0x8000 - ue error on instruction fetch
# d_side=0 cause=0xd - unrecoverable i-side async store timeout (POWER9 only)
# d_side=0 cause=0x1 - unrecoverable i-side ifetch
#
Expand Down Expand Up @@ -547,6 +548,19 @@ proc inject_mce { } {
mysim trigger clear pc $pc ; list
}

#
# We've stopped at addr and we need to inject the mce and continue
#
proc trigger_mce_ue_addr {args} {
set addr [lindex [lindex $args 0] 1]
mysim trigger clear memory system rw $addr $addr
exc_mce 0x1 0x8000 0x1
}

proc inject_mce_ue_on_addr {addr} {
mysim trigger set memory system rw $addr $addr 1 "trigger_mce_ue_addr"
}

# inject and step over one instruction, and repeat.
proc inject_mce_step { {nr 1} } {
for { set i 0 } { $i < $nr } { incr i 1 } {
Expand Down

0 comments on commit bdd925a

Please sign in to comment.