[CRIU] [PATCH 2/2] cpu: Add 'ins' mode to --cpu-cap option

Pavel Emelyanov xemul at parallels.com
Thu Dec 25 10:32:37 PST 2014


On 12/25/2014 09:26 PM, Cyrill Gorcunov wrote:
> On Thu, Dec 25, 2014 at 09:16:00PM +0300, Pavel Emelyanov wrote:
>>
>> I've tried to compare all the possible --cpu-cap options we might
>> have an failed.
>>
>> Let's summarize, CPU has many features. Here's what we get when we
>> specify --cpu-cap $smth option.
>>
>> all -- need all caps... Hm, OK
>>
>> cpu -- all caps should _match_.
>>
>> fpu -- only FPU subset of features should be equal or "better". The
>>        rest isn't checked.
>>
>> ins -- only "instructions" should be equal or "better". The rest
>>        isn't checked.
>>
>> Is that correct?
>> What's the difference between "all" and "cpu"?
> 
> all stands for any possible combination (even if
> we will need some new ones in future). At the moment
> all and cpu are meaning the same.

Really? AFAIU "all" == "cpu" + "fpu" + "ins" :)

>> Does "ins" include "fpu"?
> 
> yes, because fpu state might be saved with various instructions
> (fxsave,xsave  and etc). That said "ins" mode is like relaxed
> cpu/all mode where only particular bits should be matched.
> 
>> Can we request for "all caps should be equal or better"?
> 
> Exactly what is happening in this series.
> Look, we've a mask for all known instructions flags

These two statements contradicts each other. Either we check for
_all_ bits to be not less, or only _known_ ones. So what do we do?

> x86_ins_capability_mask, then we test if destination
> supports all of source instructions
> 
> static int cpu_validate_ins_features(CpuinfoX86Entry *img_x86_entry)
> {
> 	size_t i;
> 
> 	for (i = 0; i < ARRAY_SIZE(rt_cpu_info.x86_capability); i++) {
> 		u32 s = img_x86_entry->capability[i] & x86_ins_capability_mask[i];
> 
> 		this is source bits
> 
> 		u32 d = rt_cpu_info.x86_capability[i] & x86_ins_capability_mask[i];
> 
> 		this is destination bits
> 
> 		/*
> 		 * Destination might be more feature rich
> 		 * but not the reverse.
> 		 */
> 		if (s & ~d) {
> 
> 			make sure all bits in source are known in destination
> 
> 			pr_err("CPU instruction capabilities do not match run time\n");
> 			return -1;
> 		}
> 	}
> 
> 	return 0;
> }
> .
> 



More information about the CRIU mailing list