I'm debugging a problem in a driver I'm writing. The kernel core files I have for this show a problem in uart_remove_one_port
which is a function in the serial_core.c (i.e. part of the kernel). I ran objdump -d -S
on the vmlinux
file for the kernel I'm running to look at this better. I have the following:
ffffffff813cce60: 48 8b 83 c8 00 00 00 mov 0xc8(%rbx),%rax
ffffffff813cce67: 48 89 df mov %rbx,%rdi
ffffffff813cce6a: ff 90 98 00 00 00 callq *0x98(%rax)
I'm a bit confused about what the callq
instruction is doing. callq *0x98(%rax)
, seems to be using some expression as permissible in x86_64 stuff as mentioned here. However, I'm not sure what the '*' character does to it. I haven't found a sufficient answer to this either. Is it indirection as I'd use in C int *p = <something_real>; *p = 5;
or is it multiplying something? I believe this instruction, mov 0xc8(%rbx),%rax
, means "add 0xc8 to the rbx register and push the result in rax." Drawing on this, is this other instruction saying, "add 0x98 to rax and then dereference that by calling that function?"