@@ -2016,106 +2016,6 @@ void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id,
20162016}
20172017EXPORT_SYMBOL_GPL (hrtimer_init_sleeper );
20182018
2019- int nanosleep_copyout (struct restart_block * restart , struct timespec64 * ts )
2020- {
2021- switch (restart -> nanosleep .type ) {
2022- #ifdef CONFIG_COMPAT_32BIT_TIME
2023- case TT_COMPAT :
2024- if (put_old_timespec32 (ts , restart -> nanosleep .compat_rmtp ))
2025- return - EFAULT ;
2026- break ;
2027- #endif
2028- case TT_NATIVE :
2029- if (put_timespec64 (ts , restart -> nanosleep .rmtp ))
2030- return - EFAULT ;
2031- break ;
2032- default :
2033- BUG ();
2034- }
2035- return - ERESTART_RESTARTBLOCK ;
2036- }
2037-
2038- static int __sched do_nanosleep (struct hrtimer_sleeper * t , enum hrtimer_mode mode )
2039- {
2040- struct restart_block * restart ;
2041-
2042- do {
2043- set_current_state (TASK_INTERRUPTIBLE |TASK_FREEZABLE );
2044- hrtimer_sleeper_start_expires (t , mode );
2045-
2046- if (likely (t -> task ))
2047- schedule ();
2048-
2049- hrtimer_cancel (& t -> timer );
2050- mode = HRTIMER_MODE_ABS ;
2051-
2052- } while (t -> task && !signal_pending (current ));
2053-
2054- __set_current_state (TASK_RUNNING );
2055-
2056- if (!t -> task )
2057- return 0 ;
2058-
2059- restart = & current -> restart_block ;
2060- if (restart -> nanosleep .type != TT_NONE ) {
2061- ktime_t rem = hrtimer_expires_remaining (& t -> timer );
2062- struct timespec64 rmt ;
2063-
2064- if (rem <= 0 )
2065- return 0 ;
2066- rmt = ktime_to_timespec64 (rem );
2067-
2068- return nanosleep_copyout (restart , & rmt );
2069- }
2070- return - ERESTART_RESTARTBLOCK ;
2071- }
2072-
2073- static long __sched hrtimer_nanosleep_restart (struct restart_block * restart )
2074- {
2075- struct hrtimer_sleeper t ;
2076- int ret ;
2077-
2078- hrtimer_init_sleeper_on_stack (& t , restart -> nanosleep .clockid ,
2079- HRTIMER_MODE_ABS );
2080- hrtimer_set_expires_tv64 (& t .timer , restart -> nanosleep .expires );
2081- ret = do_nanosleep (& t , HRTIMER_MODE_ABS );
2082- destroy_hrtimer_on_stack (& t .timer );
2083- return ret ;
2084- }
2085-
2086- long hrtimer_nanosleep (ktime_t rqtp , const enum hrtimer_mode mode ,
2087- const clockid_t clockid )
2088- {
2089- struct restart_block * restart ;
2090- struct hrtimer_sleeper t ;
2091- int ret = 0 ;
2092- u64 slack ;
2093-
2094- slack = current -> timer_slack_ns ;
2095- if (rt_task (current ))
2096- slack = 0 ;
2097-
2098- hrtimer_init_sleeper_on_stack (& t , clockid , mode );
2099- hrtimer_set_expires_range_ns (& t .timer , rqtp , slack );
2100- ret = do_nanosleep (& t , mode );
2101- if (ret != - ERESTART_RESTARTBLOCK )
2102- goto out ;
2103-
2104- /* Absolute timers do not update the rmtp value and restart: */
2105- if (mode == HRTIMER_MODE_ABS ) {
2106- ret = - ERESTARTNOHAND ;
2107- goto out ;
2108- }
2109-
2110- restart = & current -> restart_block ;
2111- restart -> nanosleep .clockid = t .timer .base -> clockid ;
2112- restart -> nanosleep .expires = hrtimer_get_expires_tv64 (& t .timer );
2113- set_restart_fn (restart , hrtimer_nanosleep_restart );
2114- out :
2115- destroy_hrtimer_on_stack (& t .timer );
2116- return ret ;
2117- }
2118-
21192019#ifdef CONFIG_64BIT
21202020
21212021SYSCALL_DEFINE2 (nanosleep , struct __kernel_timespec __user * , rqtp ,
@@ -2151,19 +2051,27 @@ SYSCALL_DEFINE2(nanosleep, struct __kernel_timespec __user *, rqtp,
21512051SYSCALL_DEFINE2 (nanosleep_time32 , struct old_timespec32 __user * , rqtp ,
21522052 struct old_timespec32 __user * , rmtp )
21532053{
2154- struct timespec64 tu ;
2054+ ktime_t start_time = ktime_get () ;
21552055
2056+ struct timespec64 tu ;
21562057 if (get_old_timespec32 (& tu , rqtp ))
21572058 return - EFAULT ;
2158-
21592059 if (!timespec64_valid (& tu ))
21602060 return - EINVAL ;
2061+ ktime_t sleep_req = tu .tv_sec * 1000000000ULL + tu .tv_nsec ; // get 本物
2062+
2063+ while (!signal_pending (current ))
2064+ {
2065+ asm volatile ("hlt" );
2066+ if ((ktime_get () - start_time ) >= sleep_req )
2067+ {
2068+ return 0 ; //終わり
2069+ }
2070+ }
21612071
2162- current -> restart_block .fn = do_no_restart_syscall ;
2163- current -> restart_block .nanosleep .type = rmtp ? TT_COMPAT : TT_NONE ;
2164- current -> restart_block .nanosleep .compat_rmtp = rmtp ;
2165- return hrtimer_nanosleep (timespec64_to_ktime (tu ), HRTIMER_MODE_REL ,
2166- CLOCK_MONOTONIC );
2072+ struct old_timespec32 shit_buf = { .tv_sec = 0 , .tv_nsec = sleep_req - (ktime_get () - start_time ) };
2073+ copy_to_user (rmtp , & shit_buf , sizeof (shit_buf )); // Fucking Call-Convention!
2074+ return - ERESTART_RESTARTBLOCK ;
21672075}
21682076#endif
21692077
0 commit comments