hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
kernel/arch/sparc/kernel/sys_sparc_64.c
....@@ -28,8 +28,9 @@
2828 #include <linux/random.h>
2929 #include <linux/export.h>
3030 #include <linux/context_tracking.h>
31
-
31
+#include <linux/timex.h>
3232 #include <linux/uaccess.h>
33
+
3334 #include <asm/utrap.h>
3435 #include <asm/unistd.h>
3536
....@@ -335,25 +336,28 @@
335336 {
336337 long err;
337338
339
+ if (!IS_ENABLED(CONFIG_SYSVIPC))
340
+ return -ENOSYS;
341
+
338342 /* No need for backward compatibility. We can start fresh... */
339343 if (call <= SEMTIMEDOP) {
340344 switch (call) {
341345 case SEMOP:
342
- err = sys_semtimedop(first, ptr,
343
- (unsigned int)second, NULL);
346
+ err = ksys_semtimedop(first, ptr,
347
+ (unsigned int)second, NULL);
344348 goto out;
345349 case SEMTIMEDOP:
346
- err = sys_semtimedop(first, ptr, (unsigned int)second,
347
- (const struct timespec __user *)
348
- (unsigned long) fifth);
350
+ err = ksys_semtimedop(first, ptr, (unsigned int)second,
351
+ (const struct __kernel_timespec __user *)
352
+ (unsigned long) fifth);
349353 goto out;
350354 case SEMGET:
351
- err = sys_semget(first, (int)second, (int)third);
355
+ err = ksys_semget(first, (int)second, (int)third);
352356 goto out;
353357 case SEMCTL: {
354
- err = sys_semctl(first, second,
355
- (int)third | IPC_64,
356
- (unsigned long) ptr);
358
+ err = ksys_old_semctl(first, second,
359
+ (int)third | IPC_64,
360
+ (unsigned long) ptr);
357361 goto out;
358362 }
359363 default:
....@@ -364,18 +368,18 @@
364368 if (call <= MSGCTL) {
365369 switch (call) {
366370 case MSGSND:
367
- err = sys_msgsnd(first, ptr, (size_t)second,
371
+ err = ksys_msgsnd(first, ptr, (size_t)second,
368372 (int)third);
369373 goto out;
370374 case MSGRCV:
371
- err = sys_msgrcv(first, ptr, (size_t)second, fifth,
375
+ err = ksys_msgrcv(first, ptr, (size_t)second, fifth,
372376 (int)third);
373377 goto out;
374378 case MSGGET:
375
- err = sys_msgget((key_t)first, (int)second);
379
+ err = ksys_msgget((key_t)first, (int)second);
376380 goto out;
377381 case MSGCTL:
378
- err = sys_msgctl(first, (int)second | IPC_64, ptr);
382
+ err = ksys_old_msgctl(first, (int)second | IPC_64, ptr);
379383 goto out;
380384 default:
381385 err = -ENOSYS;
....@@ -395,13 +399,13 @@
395399 goto out;
396400 }
397401 case SHMDT:
398
- err = sys_shmdt(ptr);
402
+ err = ksys_shmdt(ptr);
399403 goto out;
400404 case SHMGET:
401
- err = sys_shmget(first, (size_t)second, (int)third);
405
+ err = ksys_shmget(first, (size_t)second, (int)third);
402406 goto out;
403407 case SHMCTL:
404
- err = sys_shmctl(first, (int)second | IPC_64, ptr);
408
+ err = ksys_old_shmctl(first, (int)second | IPC_64, ptr);
405409 goto out;
406410 default:
407411 err = -ENOSYS;
....@@ -510,7 +514,7 @@
510514 #ifdef DEBUG_SPARC_BREAKPOINT
511515 printk ("TRAP: Entering kernel PC=%lx, nPC=%lx\n", regs->tpc, regs->tnpc);
512516 #endif
513
- force_sig_fault(SIGTRAP, TRAP_BRKPT, (void __user *)regs->tpc, 0, current);
517
+ force_sig_fault(SIGTRAP, TRAP_BRKPT, (void __user *)regs->tpc, 0);
514518 #ifdef DEBUG_SPARC_BREAKPOINT
515519 printk ("TRAP: Returning to space: PC=%lx nPC=%lx\n", regs->tpc, regs->tnpc);
516520 #endif
....@@ -544,6 +548,63 @@
544548 return err;
545549 }
546550
551
+SYSCALL_DEFINE1(sparc_adjtimex, struct __kernel_timex __user *, txc_p)
552
+{
553
+ struct __kernel_timex txc;
554
+ struct __kernel_old_timeval *tv = (void *)&txc.time;
555
+ int ret;
556
+
557
+ /* Copy the user data space into the kernel copy
558
+ * structure. But bear in mind that the structures
559
+ * may change
560
+ */
561
+ if (copy_from_user(&txc, txc_p, sizeof(txc)))
562
+ return -EFAULT;
563
+
564
+ /*
565
+ * override for sparc64 specific timeval type: tv_usec
566
+ * is 32 bit wide instead of 64-bit in __kernel_timex
567
+ */
568
+ txc.time.tv_usec = tv->tv_usec;
569
+ ret = do_adjtimex(&txc);
570
+ tv->tv_usec = txc.time.tv_usec;
571
+
572
+ return copy_to_user(txc_p, &txc, sizeof(txc)) ? -EFAULT : ret;
573
+}
574
+
575
+SYSCALL_DEFINE2(sparc_clock_adjtime, const clockid_t, which_clock,
576
+ struct __kernel_timex __user *, txc_p)
577
+{
578
+ struct __kernel_timex txc;
579
+ struct __kernel_old_timeval *tv = (void *)&txc.time;
580
+ int ret;
581
+
582
+ if (!IS_ENABLED(CONFIG_POSIX_TIMERS)) {
583
+ pr_err_once("process %d (%s) attempted a POSIX timer syscall "
584
+ "while CONFIG_POSIX_TIMERS is not set\n",
585
+ current->pid, current->comm);
586
+
587
+ return -ENOSYS;
588
+ }
589
+
590
+ /* Copy the user data space into the kernel copy
591
+ * structure. But bear in mind that the structures
592
+ * may change
593
+ */
594
+ if (copy_from_user(&txc, txc_p, sizeof(txc)))
595
+ return -EFAULT;
596
+
597
+ /*
598
+ * override for sparc64 specific timeval type: tv_usec
599
+ * is 32 bit wide instead of 64-bit in __kernel_timex
600
+ */
601
+ txc.time.tv_usec = tv->tv_usec;
602
+ ret = do_clock_adjtime(which_clock, &txc);
603
+ tv->tv_usec = txc.time.tv_usec;
604
+
605
+ return copy_to_user(txc_p, &txc, sizeof(txc)) ? -EFAULT : ret;
606
+}
607
+
547608 SYSCALL_DEFINE5(utrap_install, utrap_entry_t, type,
548609 utrap_handler_t, new_p, utrap_handler_t, new_d,
549610 utrap_handler_t __user *, old_p,