| .. | .. |
|---|
| 17 | 17 | #include <linux/mm.h> |
|---|
| 18 | 18 | #include <linux/module.h> |
|---|
| 19 | 19 | #include <linux/rtc.h> |
|---|
| 20 | | -#include <linux/math64.h> |
|---|
| 20 | +#include <linux/audit.h> |
|---|
| 21 | 21 | |
|---|
| 22 | 22 | #include "ntp_internal.h" |
|---|
| 23 | 23 | #include "timekeeping_internal.h" |
|---|
| .. | .. |
|---|
| 190 | 190 | && (status & (STA_PPSWANDER|STA_PPSERROR))); |
|---|
| 191 | 191 | } |
|---|
| 192 | 192 | |
|---|
| 193 | | -static inline void pps_fill_timex(struct timex *txc) |
|---|
| 193 | +static inline void pps_fill_timex(struct __kernel_timex *txc) |
|---|
| 194 | 194 | { |
|---|
| 195 | 195 | txc->ppsfreq = shift_right((pps_freq >> PPM_SCALE_INV_SHIFT) * |
|---|
| 196 | 196 | PPM_SCALE_INV, NTP_SCALE_SHIFT); |
|---|
| 197 | 197 | txc->jitter = pps_jitter; |
|---|
| 198 | 198 | if (!(time_status & STA_NANO)) |
|---|
| 199 | | - txc->jitter /= NSEC_PER_USEC; |
|---|
| 199 | + txc->jitter = pps_jitter / NSEC_PER_USEC; |
|---|
| 200 | 200 | txc->shift = pps_shift; |
|---|
| 201 | 201 | txc->stabil = pps_stabil; |
|---|
| 202 | 202 | txc->jitcnt = pps_jitcnt; |
|---|
| .. | .. |
|---|
| 222 | 222 | return status & (STA_UNSYNC|STA_CLOCKERR); |
|---|
| 223 | 223 | } |
|---|
| 224 | 224 | |
|---|
| 225 | | -static inline void pps_fill_timex(struct timex *txc) |
|---|
| 225 | +static inline void pps_fill_timex(struct __kernel_timex *txc) |
|---|
| 226 | 226 | { |
|---|
| 227 | 227 | /* PPS is not implemented, so these are zero */ |
|---|
| 228 | 228 | txc->ppsfreq = 0; |
|---|
| .. | .. |
|---|
| 556 | 556 | } |
|---|
| 557 | 557 | |
|---|
| 558 | 558 | #ifdef CONFIG_GENERIC_CMOS_UPDATE |
|---|
| 559 | | -int __weak update_persistent_clock(struct timespec now) |
|---|
| 560 | | -{ |
|---|
| 561 | | - return -ENODEV; |
|---|
| 562 | | -} |
|---|
| 563 | | - |
|---|
| 564 | 559 | int __weak update_persistent_clock64(struct timespec64 now64) |
|---|
| 565 | 560 | { |
|---|
| 566 | | - struct timespec now; |
|---|
| 567 | | - |
|---|
| 568 | | - now = timespec64_to_timespec(now64); |
|---|
| 569 | | - return update_persistent_clock(now); |
|---|
| 561 | + return -ENODEV; |
|---|
| 570 | 562 | } |
|---|
| 571 | 563 | #endif |
|---|
| 572 | 564 | |
|---|
| .. | .. |
|---|
| 643 | 635 | /* |
|---|
| 644 | 636 | * Propagate a new txc->status value into the NTP state: |
|---|
| 645 | 637 | */ |
|---|
| 646 | | -static inline void process_adj_status(const struct timex *txc) |
|---|
| 638 | +static inline void process_adj_status(const struct __kernel_timex *txc) |
|---|
| 647 | 639 | { |
|---|
| 648 | 640 | if ((time_status & STA_PLL) && !(txc->status & STA_PLL)) { |
|---|
| 649 | 641 | time_state = TIME_OK; |
|---|
| .. | .. |
|---|
| 666 | 658 | } |
|---|
| 667 | 659 | |
|---|
| 668 | 660 | |
|---|
| 669 | | -static inline void process_adjtimex_modes(const struct timex *txc, s32 *time_tai) |
|---|
| 661 | +static inline void process_adjtimex_modes(const struct __kernel_timex *txc, |
|---|
| 662 | + s32 *time_tai) |
|---|
| 670 | 663 | { |
|---|
| 671 | 664 | if (txc->modes & ADJ_STATUS) |
|---|
| 672 | 665 | process_adj_status(txc); |
|---|
| .. | .. |
|---|
| 718 | 711 | * adjtimex mainly allows reading (and writing, if superuser) of |
|---|
| 719 | 712 | * kernel time-keeping variables. used by xntpd. |
|---|
| 720 | 713 | */ |
|---|
| 721 | | -int __do_adjtimex(struct timex *txc, const struct timespec64 *ts, s32 *time_tai) |
|---|
| 714 | +int __do_adjtimex(struct __kernel_timex *txc, const struct timespec64 *ts, |
|---|
| 715 | + s32 *time_tai, struct audit_ntp_data *ad) |
|---|
| 722 | 716 | { |
|---|
| 723 | 717 | int result; |
|---|
| 724 | 718 | |
|---|
| .. | .. |
|---|
| 729 | 723 | /* adjtime() is independent from ntp_adjtime() */ |
|---|
| 730 | 724 | time_adjust = txc->offset; |
|---|
| 731 | 725 | ntp_update_frequency(); |
|---|
| 726 | + |
|---|
| 727 | + audit_ntp_set_old(ad, AUDIT_NTP_ADJUST, save_adjust); |
|---|
| 728 | + audit_ntp_set_new(ad, AUDIT_NTP_ADJUST, time_adjust); |
|---|
| 732 | 729 | } |
|---|
| 733 | 730 | txc->offset = save_adjust; |
|---|
| 734 | 731 | } else { |
|---|
| 735 | | - |
|---|
| 736 | 732 | /* If there are input parameters, then process them: */ |
|---|
| 737 | | - if (txc->modes) |
|---|
| 733 | + if (txc->modes) { |
|---|
| 734 | + audit_ntp_set_old(ad, AUDIT_NTP_OFFSET, time_offset); |
|---|
| 735 | + audit_ntp_set_old(ad, AUDIT_NTP_FREQ, time_freq); |
|---|
| 736 | + audit_ntp_set_old(ad, AUDIT_NTP_STATUS, time_status); |
|---|
| 737 | + audit_ntp_set_old(ad, AUDIT_NTP_TAI, *time_tai); |
|---|
| 738 | + audit_ntp_set_old(ad, AUDIT_NTP_TICK, tick_usec); |
|---|
| 739 | + |
|---|
| 738 | 740 | process_adjtimex_modes(txc, time_tai); |
|---|
| 741 | + |
|---|
| 742 | + audit_ntp_set_new(ad, AUDIT_NTP_OFFSET, time_offset); |
|---|
| 743 | + audit_ntp_set_new(ad, AUDIT_NTP_FREQ, time_freq); |
|---|
| 744 | + audit_ntp_set_new(ad, AUDIT_NTP_STATUS, time_status); |
|---|
| 745 | + audit_ntp_set_new(ad, AUDIT_NTP_TAI, *time_tai); |
|---|
| 746 | + audit_ntp_set_new(ad, AUDIT_NTP_TICK, tick_usec); |
|---|
| 747 | + } |
|---|
| 739 | 748 | |
|---|
| 740 | 749 | txc->offset = shift_right(time_offset * NTP_INTERVAL_FREQ, |
|---|
| 741 | 750 | NTP_SCALE_SHIFT); |
|---|
| 742 | 751 | if (!(time_status & STA_NANO)) |
|---|
| 743 | | - txc->offset /= NSEC_PER_USEC; |
|---|
| 752 | + txc->offset = (u32)txc->offset / NSEC_PER_USEC; |
|---|
| 744 | 753 | } |
|---|
| 745 | 754 | |
|---|
| 746 | 755 | result = time_state; /* mostly `TIME_OK' */ |
|---|
| .. | .. |
|---|
| 762 | 771 | /* fill PPS status fields */ |
|---|
| 763 | 772 | pps_fill_timex(txc); |
|---|
| 764 | 773 | |
|---|
| 765 | | - txc->time.tv_sec = (time_t)ts->tv_sec; |
|---|
| 774 | + txc->time.tv_sec = ts->tv_sec; |
|---|
| 766 | 775 | txc->time.tv_usec = ts->tv_nsec; |
|---|
| 767 | 776 | if (!(time_status & STA_NANO)) |
|---|
| 768 | | - txc->time.tv_usec /= NSEC_PER_USEC; |
|---|
| 777 | + txc->time.tv_usec = ts->tv_nsec / NSEC_PER_USEC; |
|---|
| 769 | 778 | |
|---|
| 770 | 779 | /* Handle leapsec adjustments */ |
|---|
| 771 | 780 | if (unlikely(ts->tv_sec >= ntp_next_leap_sec)) { |
|---|