Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  mmu.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (C) 2015 Thomas Meyer (thomas@m3y3r.de)
 * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
 */


#include <linux/mm.h>
#include <linux/sched/signal.h>
#include <linux/slab.h>

#include <shared/irq_kern.h>
#include <asm/pgalloc.h>
#include <asm/sections.h>
#include <asm/mmu_context.h>
#include <as-layout.h>
#include <os.h>
#include <skas.h>
#include <stub-data.h>

/* Ensure the stub_data struct covers the allocated area */
static_assert(sizeof(struct stub_data) == STUB_DATA_PAGES * UM_KERN_PAGE_SIZE);

static spinlock_t mm_list_lock;
static struct list_head mm_list;

int init_new_context(struct task_struct *task, struct mm_struct *mm)
{
 struct mm_id *new_id = &mm->context.id;
 unsigned long stack = 0;
 int ret = -ENOMEM;

 stack = __get_free_pages(GFP_KERNEL | __GFP_ZERO, ilog2(STUB_DATA_PAGES));
 if (stack == 0)
  goto out;

 new_id->stack = stack;

 scoped_guard(spinlock_irqsave, &mm_list_lock) {
  /* Insert into list, used for lookups when the child dies */
  list_add(&mm->context.list, &mm_list);
 }

 ret = start_userspace(new_id);
 if (ret < 0)
  goto out_free;

 /* Ensure the new MM is clean and nothing unwanted is mapped */
 unmap(new_id, 0, STUB_START);

 return 0;

 out_free:
 free_pages(new_id->stack, ilog2(STUB_DATA_PAGES));
 out:
 return ret;
}

void destroy_context(struct mm_struct *mm)
{
 struct mm_context *mmu = &mm->context;

 /*
 * If init_new_context wasn't called, this will be
 * zero, resulting in a kill(0), which will result in the
 * whole UML suddenly dying.  Also, cover negative and
 * 1 cases, since they shouldn't happen either.
 *
 * Negative cases happen if the child died unexpectedly.
 */

 if (mmu->id.pid >= 0 && mmu->id.pid < 2) {
  printk(KERN_ERR "corrupt mm_context - pid = %d\n",
         mmu->id.pid);
  return;
 }

 if (mmu->id.pid > 0) {
  os_kill_ptraced_process(mmu->id.pid, 1);
  mmu->id.pid = -1;
 }

 if (using_seccomp && mmu->id.sock)
  os_close_file(mmu->id.sock);

 free_pages(mmu->id.stack, ilog2(STUB_DATA_PAGES));

 guard(spinlock_irqsave)(&mm_list_lock);

 list_del(&mm->context.list);
}

static irqreturn_t mm_sigchld_irq(int irq, void* dev)
{
 struct mm_context *mm_context;
 pid_t pid;

 guard(spinlock)(&mm_list_lock);

 while ((pid = os_reap_child()) > 0) {
  /*
* A child died, check if we have an MM with the PID. This is
* only relevant in SECCOMP mode (as ptrace will fail anyway).
*
* See wait_stub_done_seccomp for more details.
*/

  list_for_each_entry(mm_context, &mm_list, list) {
   if (mm_context->id.pid == pid) {
    struct stub_data *stub_data;
    printk("Unexpectedly lost MM child! Affected tasks will segfault.");

    /* Marks the MM as dead */
    mm_context->id.pid = -1;

    /*
 * NOTE: If SMP is implemented, a futex_wake
 * needs to be added here.
 */

    stub_data = (void *)mm_context->id.stack;
    stub_data->futex = FUTEX_IN_KERN;

    /*
 * NOTE: Currently executing syscalls by
 * affected tasks may finish normally.
 */

    break;
   }
  }
 }

 return IRQ_HANDLED;
}

static int __init init_child_tracking(void)
{
 int err;

 spin_lock_init(&mm_list_lock);
 INIT_LIST_HEAD(&mm_list);

 err = request_irq(SIGCHLD_IRQ, mm_sigchld_irq, 0, "SIGCHLD", NULL);
 if (err < 0)
  panic("Failed to register SIGCHLD IRQ: %d", err);

 return 0;
}
early_initcall(init_child_tracking)

Messung V0.5
C=94 H=73 G=83

¤ Dauer der Verarbeitung: 0.1 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge