blob: 2e83047785e1ae090916ddd1123bfcc7a2270b91 [file] [log] [blame]
# Copyright 2020 The Android KVM Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##
## This is a GDB script with commands to easier debug KVM on arm64.
## Do not use this script directly. The calling script first replaces
## variables in the form "##VAR##" with real values.
##
set architecture aarch64
define virt_to_phys
set $__addr = $arg0
if ($__addr & $kern_va_lm_bit) == 0
p/x (($__addr & (~$page_offset)) + $phys_offset)
else
p/x ($__addr - $kimage_voffset)
end
end
document virt_to_phys
Convert kernel VA to IPA and print the result.
Usage: virt_to_phy <kernel_va>
end
define phys_to_virt
set $__addr = $arg0
p/x (($__addr - $phys_offset) | $page_offset)
end
document phys_to_virt
Convert kernel IPA to linear-map VA and print the result.
Usage: phys_to_virt <kernel_ipa>
end
define lm_alias
virt_to_phys $arg0
phys_to_virt $
end
document lm_alias
Convert kernel VA to linear-map VA and print the result.
Usage: lm_alias <kernel_va>
end
define kern_hyp_va
set $__addr = $arg0
p/x (($__addr & $hyp_va_mask) | $hyp_va_tag)
end
document kern_hyp_va
Convert kernel VA to hyp VA and print the result.
Usage: kern_hyp_va <kernel_va>
end
define sym_hyp_va
set $__addr = (unsigned long)&$arg0
lm_alias $__addr
kern_hyp_va $
end
document sym_hyp_va
Get hyp VA of an ELF symbol and print the result.
Usage: sym_hyp_va <sym>
end
define break_nvhe
sym_hyp_va __kvm_nvhe_$arg0
b *$
end
define bn
break_nvhe $arg0
end
document break_nvhe
Set breakpoint at hyp VA of a given nVHE symbol name.
Symbol name is provided without the "__kvm_nvhe_" prefix.
Usage: break_nvhe <sym>
bn <sym>
end
file "##ELF_PATH##"
# Break after memory layout constants have been computed.
break apply_alternatives_all
commands
# Cache kernel constants so they are available regardless
# of CurrentEL.
set $hyp_va_tag = (tag_val << tag_lsb)
set $hyp_va_mask = va_mask
set $kern_va_lm_bit = (1ul << (vabits_actual - 1))
set $page_offset = (-(1ul << 48))
set $phys_offset = memstart_addr
set $kimage_voffset = kimage_voffset
# Load the ELF again under hyp VA.
# We use '_stext' here because 'add-symbol-file' expects address
# of the '.text' section. '_text' corresponds to '.head.text'.
sym_hyp_va _stext
add-symbol-file "##ELF_PATH##" $
# Unset this breakpoint.
# Note: this deletes *all* breakpoints.
delete breakpoint
echo Protected KVM debug mode initialized\n
end
# Connect to QEMU emulating the kernel.
target remote :1234
# Boot the kernel up to the breakpoint above.
continue