Keyboard lights, TLB shootdowns, battery in sysfs, /proc/pid/maps

Caps, Num and Scroll Lock now light their LEDs on PS/2 and USB keyboards,
share one state between keyboards, and stop toggling on key repeat. X sets
them through evdev writes while it holds the keyboard.

Unmapping memory in a process with threads on other CPUs now flushes their
TLBs with an IPI. Without it a freed page stayed reachable through stale
translations, which corrupted Epiphany's heap on SMP.

ACPI batteries and AC adapters appear under /sys/class/power_supply.
/proc/<pid>/maps lists file mappings, and a process killed by a fault
names the file and offset it died in. r8169 gets a 256-entry RX ring.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S1giNvrHTrPMPw7V6x1kQ4
This commit is contained in:
Nexoniarz 2026-10-25 13:43:27 +01:00
commit 438e7af141
18 changed files with 945 additions and 9 deletions

View file

@ -736,6 +736,16 @@ int net_attach_late(struct device *);
int net_eth_poll(void);
void net_eth_link_check(void);
uint poll_generation(void);
// kernel/proc/mapname.c
struct mm;
void mapname_add(struct mm*, uint64 start, uint64 len, uint64 off, const char *path);
void mapname_unmap(struct mm*, uint64 start, uint64 len);
void mapname_free(struct mm*);
void mapname_copy(struct mm *dst, struct mm *src);
int mapname_find(struct mm*, uint64 addr, char *out, int cap, uint64 *off);
int mapname_gen(struct mm*, char *buf, int cap);
void mapname_report(struct proc*);
int proc_maps(int pid, char *buf, int cap);
int net_eth_count(void);
void net_eth_counts(int i, uint64 *rx, uint64 *tx);
struct netif *net_eth_netif(int i);
@ -809,6 +819,13 @@ uint32 inotify_cookie(void);
int ev_fionread(struct evobj *o);
int pipe_avail(struct pipe *p);
int vm_fault(addr_t va);
void tlb_init(void);
// keyboard lock keys and their lights: kernel/dev/kbd.c
void kbd_set_leds(uint locks);
void kbd_lock_key(uint lock, int down);
uint kbd_lock_state(void);
void hid_leds_want(int bits);
void lapic_send_ipi(int apicid, int vector);
pte_t* walkpte(pml4e_t *pgdir, const void *va);
int path_identity(char *path, int follow, int onlydir, uint *dev, uint64 *inum);
int memfd_rw(int id, int user, uint64 buf, uint64 off, int n, int writing);

View file

@ -48,6 +48,7 @@ struct mm {
uint64 mmap_next; // next free mmap VA (bump allocator, see sys_mmap)
pml4e_t *pgdir;
struct vma vma[NVMA]; // VMA tracking for mmap
struct mapname *names; // which file each span came from; mapname.c
};
// The descriptor table, and FD_CLOEXEC beside it.