On Mar 27, 2011, at 10:29 PM, Julian Elischer wrote:
> On 3/27/11 3:32 PM, Warner Losh wrote:
>> On Mar 26, 2011, at 8:43 AM, Jing Huang wrote:
>>
>>> Hi,
>>>
>>> Thanks for you all sincerely. Under your guidance, I read the
>>> specification of TSC in Intel Manual and learned the hardware feature
>>> of TSC:
>>>
>>> Processor families increment the time-stamp counter differently:
>>> • For Pentium M processors (family [06H], models [09H, 0DH]); for Pentium
>>> 4
>>> processors, Intel Xeon processors (family [0FH], models [00H, 01H, or 02H]);
>>> and for P6 family processors: the time-stamp counter increments with every
>>> internal processor clock cycle.
>>>
>>> • For Pentium 4 processors, Intel Xeon processors (family [0FH],
>>> models [03H and
>>> higher]); for Intel Core Solo and Intel Core Duo processors (family [06H],
>>> model
>>> [0EH]); for the Intel Xeon processor 5100 series and Intel Core 2 Duo
>>> processors
>>> (family [06H], model [0FH]); for Intel Core 2 and Intel Xeon processors
>>> (family
>>> [06H], display_model [17H]); for Intel Atom processors (family [06H],
>>> display_model [1CH]): the time-stamp counter increments at a constant rate.
>>>
>>> Maybe we would implement gettimeofday as fellows. Firstly, use cpuid
>>> to find the family and models of current CPU. If the CPU support
>>> constant TSC, we look up the shared page and calculate the precise
>>> time in usermode. If the platform has invariant TSCs, and we just
>>> fallback to a syscall. So, I think a single global shared page maybe
>>> proper.
>> I think that the userspace portion should be more like:
>>
>> int kernel_time_type) SECTION(shared);
>> struct tsc_goo tsc_time_data SECTION(shared);
>>
>> switch (kernel_time_type) {
>> case 1:
>> /* code to use tsc_time_data to return time */
>> break;
>> default:
>> /* call the kernel */
>> }
>>
>> I think we should avoid hard-coding lists of CPU families in userland. The
>> kernel init routines will decide, based on the CPU type and other stuff if
>> this optimization can be done. This would allow the kernel to update to
>> support new CPU types without needing to churn libc.
>>
>> Warner
>>
>> P.S. The SECTION(shared) notation above just means that the variables are
>> in the shared page.
>
> As has been mentioned here and there, the gold-standard way for doing this is
> for the kernel to export a special memory region
> in elf format that can be linked to with exported kernel sanctioned code
> snippets specially tailored for the cpu/OS/binray-format
> in question. There is no real security risk to this but potential upsides are
> great.
You'll have to map multiple pages if you do this: one for the data that has to
be exported from the kernel and one that has to be the executable code. I
don't think this is necessarily the "gold standard" at all. I think it is
overkill that we'll grow to regret.
My method you'll have the code 100% in userland, where it belongs. If you want
to map CPU-type-specific code, add it to ld.so.
Warner
>>>
>>> On Sat, Mar 26, 2011 at 10:12 PM, John Baldwin<[email protected]> wrote:
>>>> On Saturday, March 26, 2011 08:16:46 am Peter Jeremy wrote:
>>>>> On 2011-Mar-25 08:18:38 -0400, John Baldwin<[email protected]> wrote:
>>>>>> For modern Intel CPUs you can just assume that the TSCs are in sync
>>>>>> across
>>>>>> packages. They also have invariant TSC's meaning that the frequency
>>>>>> doesn't change.
>>>>> Synchronised P-state invariant TSCs vastly simplify the problem but
>>>>> not everyone has them. Should the fallback be more complexity to
>>>>> support per-CPU TSC counts and varying frequencies or a fallback to
>>>>> reading the time via a syscall?
>>>> I think we should just fallback to a syscall in that case. We will also
>>>> need
>>>> to do that if the TSC is not used as the timecounter (or always duplicate
>>>> the
>>>> ntp_adjtime() work we do for the current timecounter for the TSC
>>>> timecounter).
>>>>
>>>> Doing this easy case may give us the most bang for the buck, and it is
>>>> also a
>>>> good first milestone. Once that is in place we can decide what the value
>>>> is
>>>> in extending it to support harder variations.
>>>>
>>>> One thing we do need to think about is if the shared page should just
>>>> export a
>>>> fixed set of global data, or if it should export routines. The latter
>>>> approach is more complex, but it makes the ABI boundary between userland
>>>> and
>>>> the kernel more friendly to future changes. I believe Linux does the
>>>> latter
>>>> approach?
>>>>
>>>> --
>>>> John Baldwin
>>>>
>>> _______________________________________________
>>> [email protected] mailing list
>>> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
>>> To unsubscribe, send any mail to "[email protected]"
>>>
>>>
>> _______________________________________________
>> [email protected] mailing list
>> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
>> To unsubscribe, send any mail to "[email protected]"
>>
>>
>
>
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[email protected]"