[patch] LINUX_REBOOT_MAGIC1 printed as UNKNOWN VALUE in argstr

Mike Mason mmlnx@us.ibm.com
Thu Sep 13 23:43:00 GMT 2007


Why does aux_syscalls.stp use hard coded values instead of embedded C and the actual defines?  They're all over the place.  Something like below seems more proper to me.

%{
#include <linux/reboot.h>
%}

function _reboot_magic_str:string(magic:long) %{
	int magic = (int)THIS->magic;
	switch (magic) {
	case LINUX_REBOOT_MAGIC1:
		strlcpy(THIS->__retvalue, "LINUX_REBOOT_MAGIC1", MAXSTRINGLEN);
		break;
	case LINUX_REBOOT_MAGIC2:
		strlcpy(THIS->__retvalue, "LINUX_REBOOT_MAGIC2", MAXSTRINGLEN);
		break;
	case LINUX_REBOOT_MAGIC2A:
		strlcpy(THIS->__retvalue, "LINUX_REBOOT_MAGIC2A", MAXSTRINGLEN);
		break;
	case LINUX_REBOOT_MAGIC2B:
		strlcpy(THIS->__retvalue, "LINUX_REBOOT_MAGIC2B", MAXSTRINGLEN);
		break;
	case LINUX_REBOOT_MAGIC2C:
		strlcpy(THIS->__retvalue, "LINUX_REBOOT_MAGIC2C", MAXSTRINGLEN);
		break;
	default:
                snprintf(THIS->__retvalue, MAXSTRINGLEN, "UNKNOWN VALUE: %d", magic);
	}
%}


Frank Ch. Eigler wrote:
> "Zhaolei" <zhaolei@cn.fujitsu.com> writes:
> 
>> Argument of magic in argstr is displayed as "UNKNOWN VALUE" because:
>> Stap get value of magic from kernel, and it is negative value. 
> 
> This makes sense, as reboot(2) is defined to take signed int parameters.
> 
>> For this problem, I will commit following patch:
> 
> Could this be better (to accept more sign/size mismatches)?
> 
>>  function _reboot_magic_str(magic) {
>> -   if(magic==0xFEE1DEAD) return "LINUX_REBOOT_MAGIC1"
>> +   if(magic==        0xFEE1DEAD) return "LINUX_REBOOT_MAGIC1"
>> +   if(magic==0xFFFFFFFFFEE1DEAD) return "LINUX_REBOOT_MAGIC1"
>> [...]
> 
> - FChE



More information about the Systemtap mailing list