Call for review && test: linux_kdump-1.6

Chagin Dmitry chagin.dmitry at gmail.com
Mon Apr 14 16:18:31 UTC 2008


On Mon, 14 Apr 2008, Kostik Belousov wrote:

> On Mon, Apr 14, 2008 at 03:31:37PM +0300, Kostik Belousov wrote:
>> On Mon, Apr 14, 2008 at 12:42:29AM +0400, Chagin Dmitry wrote:
>>> On Sun, 13 Apr 2008, Kostik Belousov wrote:
>>>
>>>> On Sun, Apr 13, 2008 at 11:11:55PM +0400, Chagin Dmitry wrote:
>>>>> On Sun, 13 Apr 2008, Kostik Belousov wrote:
>>>>>
>>>>>> On Sun, Apr 13, 2008 at 08:32:48PM +0200, Roman Divacky wrote:
>>>>>>> On Sun, Apr 13, 2008 at 09:58:08PM +0400, Chagin Dmitry wrote:
>>>>>>>> On Sat, 12 Apr 2008, Roman Divacky wrote:
>>>>>>>>
>>>>>>>>>> And question: whether i can add to linuxolator some ktr_struct
>>>>>>>>>>  functionality?
>>>>>>>>>
>>>>>>>>> sure... please provide a patch and I'll take care about it.
>>>>>>>>
>>>>>>>> ok, thnx :)
>>>>>>>> what about EJUSTRETURN?
>>>>>>>> i attached simple patch for demo only (not tested).
>>>>>>>
>>>>>>> uh... can you provide diff -u ? I dont understand the diff at all ;)
>>>>>>
>>>>>> Also, please note that the ML software strips your attachments. Either
>>>>>> inline the patch, or use the plain-text content-type for it.
>>>>>>
>>>>>
>>>>> ups... ah google ))
>>>>> i have understood, sorry and thnx.
>>>>> Speech about that in linux_kdump it is impossible to distinguish
>>>>> EJUSTRETURN from a real error. look:
>>>>>
>>>>> --- sys/i386/i386/trap.c.orig	2008-04-13 21:39:18.000000000 +0400
>>>>> +++ sys/i386/i386/trap.c	2008-04-13 22:35:25.000000000 +0400
>>>>> @@ -1091,8 +1091,12 @@
>>>>>  	    td->td_proc->p_pid, td->td_name, code);
>>>>>
>>>>>  #ifdef KTRACE
>>>>> -	if (KTRPOINT(td, KTR_SYSRET))
>>>>> -		ktrsysret(code, error, td->td_retval[0]);
>>>>> +	if (KTRPOINT(td, KTR_SYSRET)) {
>>>>> +		if (error == EJUSTRETURN)
>>>>> +			ktrsysret(code, 0, td->td_retval[0]);
>>>>> +		else
>>>>> +			ktrsysret(code, error, td->td_retval[0]);
>>>>> +	}
>>>>>  #endif
>>>>>
>>>>>  	/*
>>>>> @@ -1104,4 +1108,3 @@
>>>>>
>>>>>  	PTRACESTOP_SC(p, td, S_PT_SCX);
>>>>>  }
>>>>> -
>>>>
>>>> I do not quite understand the intent of this change.
>>>>
>>>> EJUSTRETURN is used for two different purposes in the kernel.
>>>> 1. The sigreturn family of the syscalls use it after the interrupted
>>>> frame is restored to avoid the normal syscall return sequence to modify
>>>> the machine state.
>>>> 2. It is used by the kernel to notify the in-kernel caller code about
>>>> some special condition, that nonetheless shall not be returned to the
>>>> userspace.
>>>>
>>>> Only the first case is applicable to the kdump, and IMHO you actually
>>>> destroy some information, since error == EJUSTRETURN is reported as 0.
>>>>
>>>> Could you, please, provide some more arguments in the support of your
>>>> proposed change ?
>>>>
>>>
>>> Thanks for you informative reply Kostya.
>>> The problem arises only in linux_kdump. Because linux error
>>> codes negative and EJUSTRETURN coincides with ENOENT.
>>> Before a call ktr_sysret we decode return codes of emulators syscalls.
>>
>> Ah, I see. Then, we shall never dump the ERESTART and EJUSTRETURN
>> for the emulated ABIs. At least, this is true for Linux, I am not
>> so sure about iBCS2 and SVR4.
>>

I do not absolutely agree with this statement. If the emulated syscalls 
should return native FreeBSD errno, that why to not write them to a 
ktrace file without conversion? Current linux_kdump port uses strerror 
because expects it. At least, it is convenient :)

Your patch is correct for my version of linux_kdump, but does not solve 
a problem with the current port version.

If it's possible, explain please, that is not correct in my last patch?

thnx

>> Could you test the patch below, instead ?
>
>> diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c
>> index e7de579..55642d1 100644
>> --- a/sys/i386/i386/trap.c
>> +++ b/sys/i386/i386/trap.c
>
> The patch is obviously wrong, it just prevents the Linux ENOENT to be
> dumped. Please, try this one instead.
>
> diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c
> index b6a454d..3b1368a 100644
> --- a/sys/amd64/amd64/trap.c
> +++ b/sys/amd64/amd64/trap.c
> @@ -861,9 +861,18 @@ syscall(struct trapframe *frame)
> 		frame->tf_rip -= frame->tf_err;
> 		frame->tf_r10 = frame->tf_rcx;
> 		td->td_pcb->pcb_flags |= PCB_FULLCTX;
> -		break;
> -
> +		/* FALLTHROUGH */
> 	case EJUSTRETURN:
> +#ifdef KTRACE
> +		/*
> +		 * The ABIs that use the negative error codes, like
> +		 * Linux, would confuse the in-kernel errno values
> +		 * with proper userspace errno. Clean these values to
> +		 * avoid a confusion in the kdump.
> +		 */
> +		if (p->p_sysent->sv_errsize)
> +			error = 0;
> +#endif
> 		break;
>
> 	default:
> diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c
> index e7de579..6ec04b0 100644
> --- a/sys/i386/i386/trap.c
> +++ b/sys/i386/i386/trap.c
> @@ -1040,9 +1040,18 @@ syscall(struct trapframe *frame)
> 		 * int 0x80 is 2 bytes. We saved this in tf_err.
> 		 */
> 		frame->tf_eip -= frame->tf_err;
> -		break;
> -
> +		/* FALLTHROUGH */
> 	case EJUSTRETURN:
> +#ifdef KTRACE
> +		/*
> +		 * The ABIs that use the negative error codes, like
> +		 * Linux, would confuse the in-kernel errno values
> +		 * with proper userspace errno. Clean these values to
> +		 * avoid a confusion in the kdump.
> +		 */
> +		if (p->p_sysent->sv_errsize)
> +			error = 0;
> +#endif
> 		break;
>
> 	default:
>

-- 
Have fun!
chd


More information about the freebsd-emulation mailing list